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
    Femme Profil pro
    Développeur .NET
    Inscrit en
    novembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tuvalu

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Associations - ONG

    Informations forums :
    Inscription : novembre 2018
    Messages : 5
    Points : 3
    Points
    3

    Par défaut 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
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    février 2010
    Messages
    3 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : février 2010
    Messages : 3 450
    Points : 9 114
    Points
    9 114
    Billets dans le blog
    3

    Par défaut

    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

  3. #3
    Candidat au Club
    Femme Profil pro
    Développeur .NET
    Inscrit en
    novembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tuvalu

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Associations - ONG

    Informations forums :
    Inscription : novembre 2018
    Messages : 5
    Points : 3
    Points
    3

    Par défaut

    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
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    février 2010
    Messages
    3 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : février 2010
    Messages : 3 450
    Points : 9 114
    Points
    9 114
    Billets dans le blog
    3

    Par défaut

    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

  5. #5
    Candidat au Club
    Femme Profil pro
    Développeur .NET
    Inscrit en
    novembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tuvalu

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Associations - ONG

    Informations forums :
    Inscription : novembre 2018
    Messages : 5
    Points : 3
    Points
    3

    Par défaut

    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

Discussions similaires

  1. connexion depuis un autre serveur
    Par Baldric de Dol dans le forum Administration
    Réponses: 2
    Dernier message: 29/05/2008, 11h41
  2. appel d'une image depuis un autre serveur
    Par isa150183 dans le forum Traitement d'images
    Réponses: 3
    Dernier message: 16/12/2007, 18h08
  3. Réponses: 4
    Dernier message: 28/11/2007, 17h38
  4. impdp depuis un autre serveur
    Par poc dans le forum Oracle
    Réponses: 5
    Dernier message: 05/10/2007, 19h22
  5. Réponses: 5
    Dernier message: 11/09/2007, 12h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo