Bonjour,
J'ai une petite question de débutant à poser sur les services ASP.Net
J'utilisais jusqu'à maintenant les services intégrés dans les pages ASP.Net, c'est à dire les PageMethods, qui sont très simples à utiliser directement par Javascript car il n'y a qu'un appel à PageMethods.NomDeLaMethode(fonctionJavascriptResultHandler) à faire pour effectuer la requête.
Mais voilà, j'aimerai faire la même chose... mais accessible à toutes mes pages.
Alors bien évidemment j'ai pensé au Service Web qu'on peut créer dans le site.
C'est ce que j'ai fait.
Le code est similaire au code utilisé dans mes PageMethods (avec la déclaration <WebMethod()>_ au début) donc pour ça c'est parfait.
Mon vrai problème c'est que je n'arrive pas à appeler ce service à partir de Javascript simple.
Peut être un problème de configuration? J'ai simplement rajouté mon service et le path du service dans le scriptmanager :
J'ai testé plusieurs méthodes et la dernière qui semble appeler correctement le service ressemble à celle-ci mais ASP.Net me donne une erreur comme quoi le type est incorrect :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 <asp:ScriptManager ID="sm1" runat="server" EnablePageMethods="true"> <Services> <asp:ServiceReference Path="~/CommonServices.asmx" /> </Services> </asp:ScriptManager>
Impossible de créer le type 'SisWebMobile.CommonServices'.<br /><br /><span style="size9">StackTrace : <br /> à System.Web.UI.SimpleWebHandlerParser.GetType(String typeName)<br /> à System.Web.UI.SimpleWebHandlerParser.GetTypeToCache(Assembly builtAssembly)<br /> à System.Web.Compilation.SimpleHandlerBuildProvider.GetGeneratedType(CompilerResults results)<br /> à System.Web.Compilation.BuildProvider.CreateBuildResult(CompilerResults results)<br /> à System.Web.Compilation.BuildProvider.GetBuildResult(CompilerResults results)<br /> à System.Web.Compilation.BuildManager.CompileWebFile(VirtualPath virtualPath)<br /> à System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile)<br /> à System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile)<br /> à System.Web.Compilation.BuildManager.GetVPathBuildResult(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile)<br /> à System.Web.Compilation.BuildManager.GetVPathBuildResult(HttpContext context, VirtualPath virtualPath)<br /> à System.Web.UI.WebServiceParser.GetCompiledType(String inputFile, HttpContext context)<br /> à System.Web.Services.Protocols.WebServiceHandlerFactory.GetHandler(HttpContext context, String verb, String url, String filePath)
[...]
Voici le code du service web :
Et voici le code javascript utilisé (il y a eu plusieurs versions mais celui-ci au moins me donne une erreur qui me revient par Ajax) :
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 Imports System.Web.Services Imports System.Web.Services.Protocols Imports System.ComponentModel ' Pour autoriser l'appel de ce service Web depuis un script à l'aide d'ASP.NET AJAX, supprimez les marques de commentaire de la ligne suivante. ' <System.Web.Script.Services.ScriptService()> _ Namespace SISWebMobile <System.Web.Services.WebService(Namespace:="http://tempuri.org/")> _ <System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _ <ToolboxItem(False)> _ Public Class CommonServices Inherits System.Web.Services.WebService <WebMethod()> _ Public Function HelloWorld() As String Return "Hello World" End Function <WebMethod()> _ Protected Shared Function EmptyCart() As String CurrentSession.clearProduits() Return "OK" & "Le panier est vide" & "|" & CurrentSession.getPanier.getCount() End Function End Class End Namespace
J'ai beau chercher sur des sites, la plupart utilisent les Web Services directement à partir du code .Net seulement moi j'ai besoin d'utiliser directement Javascript pour faire ma requête et récupérer le résultat.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 <script type="text/javascript"> var OnWSRequestComplete = function(res) { if (res.readyState == 4 && res.status == 200) { alert(res); } } req_params = "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"><soap:Body><HelloWorld >"; req_params = req_params + "</HelloWorld></soap:Body></soap:Envelope>"; ajaxRequest("./CommonServices.asmx", req_params, OnWSRequestComplete); </script>
Quelqu'un connaitrait un site qui explique cela?
Dès que j'arriverai à envoyer la requête au service web et de récupérer le résultat d'un HelloWorld ça fonctionnera à merveille, mais pour l'instant je bloque sur ça alors que ça ne doit pas être si difficile.
J'ai déjà un workaround si jamais ça marche pas, genre utiliser une page .ASPX simple et évaluer les POST/GET qui lui sont envoyés afin de renvoyer le résultat, mais j'aimerai le faire par la fonction de service web pour avoir un code plus clean qu'une série de "If Request.QueryString("param")=... Then... End If".
Sur certains sites j'avais vu qu'ils utilisaient genre de code comme ça :
NomDeProjet.NomDeService.NomDeMethode(...)
Mais cela n'a pas l'air de fonctionner pour moi.
Le code qui se rapproche le plus de ce que je veux est donné par :
http://aspdotnetcodebook.blogspot.co...ice-using.html
(bien qu'ils utilisent une URL fixe pour l'adresse du service web)
Merci d'avance pour vos réponses!
Je continue à chercher mais si vous avez la solution ça m'arrangerai
Partager