Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Candidat au Club
    Accéder à un WebService ASMX depuis un autre serveur (vb.net/jquery)?
    Bonjour,

    J'essai de mettre en place un webservice ASMX en VB.Net, hors je rencontre des difficultés pour communiquer avec depuis un serveur externe.

    En Localhost, je n'ai pas de problème d'accessibilité, mais depuis un autre serveur, j'ai une erreur CORS:
    Access to XMLHttpRequest at 'http://www.myDNS1.com/WebService.asmx/CallTestGet' from origin 'http://www.myDNS2.com' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.
    J'ai ajouté les DLL suivante depuis NuGet :
    • System.Web.Cors.dll
    • System.Web.Http.dll
    • System.Web.Http.Cors.dll
    • System.Web.Http.WebHost.dll


    web.config

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    			<system.web>
    				<webServices>
    				  <protocols>
    					<add name="HttpGet"/>
    					<add name="HttpPost"/>
    				  </protocols>
    				</webServices>
    			  </system.web>
    			  <system.webServer>
    				<httpProtocol>
    				  <customHeaders>
    					<add name="Access-Control-Allow-Origin" value="*" />
    					<add name="Access-Control-Allow-Headers" value="Content-Type, Accept" />
    					<add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
    				  </customHeaders>
    				</httpProtocol>
    			  </system.webServer>



    global.asax

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    			<%@ Import Namespace="System.Web.Routing" %>
    			<%@ Import Namespace="System.Web.Cors" %>
     
    			<script runat="server">
    				Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
    					Dim context = HttpContext.Current
    					Dim response = context.Response
    					response.AddHeader("Access-Control-Allow-Origin", "*")
     
    					If context.Request.HttpMethod = "OPTIONS" Then
    						response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE")
    						response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept")
    						'response.Flush()
    						response.AddHeader("Access-Control-Max-Age", "1728000")
    						response.End()
    					End If
    				End Sub
    				'[...]
    			</script>


    WebService.asmx

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    			<%@ WebService Language="VB" CodeBehind="~/App_Code/WebService.vb" Class="WebService" %>



    WebService.vb

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    			Imports System.Web.Script.Services
    			Imports System.Web.Services
     
    			<System.Web.Script.Services.ScriptService()>
    			<WebService(Namespace:="http://www.myDNS1.com/")>
    			<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)>
    			<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()>
    			Public Class WebService
    				Inherits System.Web.Services.WebService
     
    				<WebMethod()>
    				Public Function CallTestPost(name As String, age As Integer) As String
    					Return String.Format("Name: {0}{2}Age: {1}{2}TimeStamp: {3}", name, age, Environment.NewLine, DateTime.Now.ToString())
    				End Function
     
    				<WebMethod()>
    				<ScriptMethod(UseHttpGet:=True)>
    				Public Function CallTestGet() As String
    					Return Trim("Webservice Success call =)")
    				End Function
    			End Class


    ConsumeWebservice.aspx

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    			<h3>Calling WebServices : CallTest</h3>
    			<div style="width: 300px; border: 2px dotted red;padding:10px;">
    				<div><b>POST</b></div>
    				<div>Name :</div>
    				<div>
    					<asp:TextBox ID="txtName" runat="server" Text="" /></div>
    				<div>Age :</div>
    				<div>
    					<asp:TextBox ID="txtAge" runat="server" Text="" /></div>
    				<div>
    					<asp:Button ID="btnSubmit" Text="Submit" runat="server" /></div>
     
    				<div id="rsltPost">-- wait req --</div>
    			</div>
    			<div style="width: 300px; border: 2px dotted orange;padding:10px;">
    				<div><b>GET</b></div>
    				<div id="rsltGet">-- wait req --</div>
    			</div>
     
    			<script type="text/javascript">
    			$(function () {
    				$("[id*=btnSubmit]").click(function () {
    					var name = $.trim($("[id*=txtName]").val());
    					var age = $.trim($("[id*=txtAge]").val());
    					$.ajax({
    						type: "POST",
    						url: "http://www.myDNS1.com/WebService.asmx/CallTestPost", 
    						data: "{ name: '" + name + "', age: " + age + "}",
    						contentType: "application/json; charset=utf-8",
    						dataType: "json",
    						success: function (r) {
    							//alert(r.d);
    							$('#rsltPost').html('success : ' + r.d);
    						},
    						error: function (r) {
    							//alert(r.responseText);
    							$('#rsltPost').html('error : ' + r.responseText);
    						},
    						failure: function (r) {
    							//alert(r.responseText);
    							$('#rsltPost').html('failure : ' + r.responseText);
    						}
    					});
    					return false;
    				});
    			});
     
     
    			$(function () {
    				$.ajax({
    					type: "GET",
    					url: "http://www.myDNS1.com/WebService.asmx/CallTestGet",
    					contentType: "application/json; charset=utf-8",
    					dataType: "json",
    					success: function (r) {
    						//alert(r.d);
    						$('#rsltGet').html('success : ' + r.d);
    					},
    					error: function (r) {
    						//alert(r.responseText);
    						$('#rsltGet').html('error : ' + r.responseText);
    					},
    					failure: function (r) {
    						//alert(r.responseText);
    						$('#rsltGet').html('failure : ' + r.responseText);
    					}
    				});
    			});
    			</script>

  2. #2
    Modérateur

    Il me semble qu'il faut aussi indiquer les headers CORS suivant cote client :
    Code Jquery :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    "accept": "application/json",
    "Access-Control-Allow-Origin":"*"

    As-tu esssaye ?
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Candidat au Club
    Merci pour ta réponse,

    Mais comme tu peux le voir dans les sources du global.asax et du web.config, "Access-Control-Allow-Origin" est déjà implanté.
    et pour "accept" je n'ai pas trouvé dans la doc ou l'implémenter

  4. #4
    Modérateur

    Tu n'as pas lu attentivement ma reponse...

    Citation Envoyé par TachikomaWebI Voir le message
    Mais comme tu peux le voir dans les sources du global.asax et du web.config, "Access-Control-Allow-Origin" est déjà implanté.
    et pour "accept" je n'ai pas trouvé dans la doc ou l'implémenter
    Tu parles cote serveur (donc pour la generation de la reponse).

    Dans ma reponse, je parle du cote client (donc pour la generation de la requete).
    Code JQuery :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    $.ajax({
    	type: "POST",
    	url: "http://www.myDNS1.com/WebService.asmx/CallTestPost", 
    	data: "{ name: '" + name + "', age: " + age + "}",
    	contentType: "application/json; charset=utf-8",
    	dataType: "json",
    	headers: {
    		'Access-Control-Allow-Origin': '*',
    		'accept': 'application/json'
    	},
    	success: function (r) {
    		//alert(r.d);
    		$('#rsltPost').html('success : ' + r.d);
    	},
    	error: function (r) {
    		//alert(r.responseText);
    		$('#rsltPost').html('error : ' + r.responseText);
    	},
    	failure: function (r) {
    		//alert(r.responseText);
    		$('#rsltPost').html('failure : ' + r.responseText);
    	}
    });

    A noter, il est egalement possible d'utiliser crossDomain: true:
    Code JQuery :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    $.ajax({
    	type: "POST",
    	url: "http://www.myDNS1.com/WebService.asmx/CallTestPost", 
    	data: "{ name: '" + name + "', age: " + age + "}",
    	contentType: "application/json; charset=utf-8",
    	dataType: "json",
    	crossDomain: true,
    	success: function (r) {
    		//alert(r.d);
    		$('#rsltPost').html('success : ' + r.d);
    	},
    	error: function (r) {
    		//alert(r.responseText);
    		$('#rsltPost').html('error : ' + r.responseText);
    	},
    	failure: function (r) {
    		//alert(r.responseText);
    		$('#rsltPost').html('failure : ' + r.responseText);
    	}
    });
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  5. #5
    Candidat au Club
    Oups pardon ... je n'ai pas implémenté ma réponse avec le côté client ...
    Mais oui effectivement j'ai déjà essayé, et non cela ne fonctionne pas, et cela ni avec l'implémentation du header dans le Req, ni avec le crossDomain et ni les deux ensemble