Question

J'ai créé un ScriptService dans mon application Web VB.NET 4.0 (ou un site Web ... Je ne sais pas de quoi il s'agit - est-ce important?) Parce que je veux l'appeler du côté client. Je reçois des erreurs du client disant que mon espace de noms n'est pas reconnu (HomePageService dans le code ci-dessous). J'ai essayé de le qualifier avec le nom configuré sur le projet comme "espace de noms racine", mais le JS dit qu'il ne reconnaît pas non plus cet espace de noms.

L'application est ancienne - nous l'avons récemment convertie de Dotnet 2.1 à 4.0.

J'ai trouvé le sujet connexe suivant, car lorsque j'essaie d'importer System.web.extensions dans mon homepageservices.asmx.vb, Visual Studio dit qu'il ne reconnaît pas la chose même si je peux le voir, répertorié dans Studio sous des références .

System.Web.Extensions L'assemblage ne peut pas être résolu] [1

J'ai essayé de publier une question de suivi à ce sujet, parce que j'ai essayé de suivre les instructions dans la réponse mais ils n'ont pas fonctionné (je n'ai pas de "framework cible" dans le projet> Propriétés> Application), mais quelqu'un l'a supprimé parce que je Je suppose que je ne suis pas autorisé à poser des questions de suivi?

J'ai consulté divers sites et suivi des instructions, voici un exemple:http://www.asp.net/ajax/documentation/live/tutorials/consumingwebserviceswithajaxtutorial.aspx

Voici le contenu de HomePageService.asmx assis dans le dossier racine de mon site:

Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.ComponentModel
Imports System.Collections.Generic


<System.Web.Services.WebService(Namespace:="http://localhost/appname")> _
<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<ToolboxItem(False)> _
<System.Web.Script.Services.ScriptService()> _
Public Class HomepageService
    Inherits System.Web.Services.WebService

    Shared _rand As Random = New Random(Environment.TickCount)

    <WebMethod()> _
    Public Function Test(ByVal s As String) As Integer
        Return _rand.Next(0, 120)

    End Function


End Class

Extrait de la page maître:

<body>
<form id="form1" runat="server">

    <asp:ScriptManager ID="Scriptmanager1" runat="server" EnablePageMethods="true">
        <Scripts>
            <asp:ScriptReference Path="CallWebServiceMethods.js" />
        </Scripts>

        <Services>
            <asp:ServiceReference Path="HomepageService.asmx" />
        </Services>
    </asp:ScriptManager>

Et en haut de ma page, j'importe le JS:

PageRequestManager.js:

HomepageService.set_defaultSucceededCallback(
                 OnLookupComplete);
HomepageService.set_defaultFailedCallback(
                 OnError);
function OnLookup() {
    HomepageService.Test(stb.value);
}
function OnLookupComplete(result, userContext) {
    // userContext contains symbol passed into method
    var res = document.getElementById("_resultLabel");
    res.innerHTML = userContext + " : <b>" + result + "</b>";
}
function OnError(result) {
    alert("Error: " + result.get_message());
}

Mon web.config est un gâchis, mais je serai heureux de le publier ...

Était-ce utile?

La solution

Enfin, cela fonctionne. Voici comment je l'ai fait. Je ne sais pas quel était le problème. Mais après le processus ci-dessous, a fait l'affaire.

Étape 1. Suivez la procédure à pas http://msdn.microsoft.com/en-us/library/bb532367(v=vs.90).aspx, en utilisant un nouveau projet de site Web.
Ça marche. Je vais appeler cela le projet modèle.

Étape 2. Créez des fichiers dans mon application Web existante et copiez tout le code du projet Modèle: - Création de WebService Helloworld.asmx (Studio me donne également un fichier imbriqué, helloworld.asmx.vb) dans le dossier racine de mon projet. Ceci est différent du projet Model, car lorsque j'ai créé le service Web dans ce projet, il a mis le .asmx dans mon dossier racine mais il colle le .asmx.vb dans le dossier app_code. Vous ne savez pas si je devrais le déplacer manuellement ou quelque chose comme ça? Dans le passé, lorsque j'ai essayé d'utiliser des dossiers app_code ou app_data avec cette application Web, tout est allé en enfer ...

Étape 3. Modifiez le WebService pour travailler avec mon application Web au lieu du site Web: - Namespace Samples.Aspnet a commenté, non remplacé par un espace de noms différent car mon application a un espace de noms par défaut `` Fubar '', qui est le même que le projet de mon application Nom.

Voici le code résultant dans helloworld.asmx.vb dans le dossier racine de mon application Web:

Imports System
Imports System.Web
Imports System.Collections
Imports System.Web.Services
Imports System.Web.Services.Protocols

'Namespace Samples.Aspnet
<WebService([Namespace]:="http://mycompany.org/"), _
WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1), _
System.Web.Script.Services.ScriptService()> _
Public Class HelloWorld
    Inherits System.Web.Services.WebService

    Public Sub New()

    End Sub 'New


    'Uncomment the following line if using designed components 
    'InitializeComponent(); 

    <WebMethod()> _
    Public Function Greetings() As String
        Dim serverTime As String = _
            String.Format("Current date and time: {0}.", DateTime.Now)
        Dim greet As String = "Hello World. <br/>" + serverTime
        Return greet

    End Function 'Greetings
End Class 'HelloWorld

'End Namespace

Et voici le code dans helloworld.asmx, également dans le dossier racine:

<%@ WebService Language="vb" CodeBehind="HelloWorld.asmx.vb" Class="Fubar.HelloWorld" %>

Étape 4. Créez le js "helloworld.js", collez-le dans un dossier racine comme dans le projet modèle et collez le code du projet modèle. Faites une modification pour correspondre à l'espace de noms de mon application. Voici le code résultant:

var helloWorldProxy;

// Initializes global and proxy default variables.
function pageLoad() {
    // Instantiate the service proxy.
  //  helloWorldProxy = new Samples.Aspnet.HelloWorld();
    helloWorldProxy = new Fubar.HelloWorld();
    // Set the default call back functions.
    helloWorldProxy.set_defaultSucceededCallback(SucceededCallback);
    helloWorldProxy.set_defaultFailedCallback(FailedCallback);
}


// Processes the button click and calls
// the service Greetings method.  
function OnClickGreetings() {
    var greetings = helloWorldProxy.Greetings();
}

// Callback function that
// processes the service return value.
function SucceededCallback(result) {
    var RsltElem = document.getElementById("Results");
    RsltElem.innerHTML = result;
}

// Callback function invoked when a call to 
// the  service methods fails.
function FailedCallback(error, userContext, methodName) {
    if (error !== null) {
        var RsltElem = document.getElementById("Results");

        RsltElem.innerHTML = "An error occurred: " +
            error.get_message();
    }
}

if (typeof (Sys) !== "undefined") Sys.Application.notifyScriptLoaded();

Étape 5. Ajoutez du code à ma balise ScriptManager dans ma page maître. Cela correspond au code du projet modèle dans Default.aspx; La balise ScriptManager ci-dessous est identique à celle du projet modèle:

<body>
    <form id="form1" runat="server">

        <asp:ScriptManager runat="server" ID="ScriptManager">
            <Services>
                <asp:ServiceReference path="~/HelloWorld.asmx" />
            </Services>
            <Scripts>
                <asp:ScriptReference Path="~/HelloWorld.js" />
            </Scripts>
        </asp:ScriptManager>

Étape 5. Ajoutez des contrôles à ma page de test comme ils l'ont fait dans Default.aspx dans le projet de modèle:

   <div id="divTestWebServices">

         <button id="Button1" onclick="OnClickGreetings(); return false;">Greetings</button>
         <div>
            <span id="Results"></span>
        </div>   
    </div>

Étape 6. Exécutez Fubar et accédez à la page de test, puis appuyez sur le bouton.

Ça marche!!! Je ne sais pas pourquoi cela ne fonctionnerait pas avant, mais après trois jours, je suis prêt à passer à autre chose maintenant ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top