WebService / ScriptService не найден; System.Web.Extensions не распознаются - PullRequest
0 голосов
/ 26 января 2012

Я создал скрипт-сервис в своем веб-приложении vb.net 4.0 (или на веб-сайте ... не уверен, что это - имеет ли это значение?), Потому что я хочу вызвать его со стороны клиента. Я получаю клиентские сообщения о том, что мое пространство имен не распознано (HomepageService в приведенном ниже коде) Я попытался определить его с именем, настроенным в проекте, как «корневое пространство имен», но js говорит, что оно также не распознает это пространство имен.

Приложение старое - мы недавно преобразовали его из dotnet 2.1 в 4.0.

Я нашел следующую связанную тему, потому что, когда я пытаюсь импортировать System.Web.Extensions в моем HomepageServices.asmx.vb, Visual Studio говорит, что не распознает эту вещь, даже если я ее вижу, перечисленную прямо там в Студия по рекомендациям.

[Сборка System.Web.Extensions не может быть разрешена] [1]

Я попытался опубликовать дополнительный вопрос в этой теме, потому что я пытался следовать инструкциям в ответе, но они не работали (у меня нет «Целевой платформы» в Project> Properties> Application), но кто-то удалил это потому что я не могу задавать дополнительные вопросы?

Я просматривал различные сайты и следовал инструкциям, вот пример: http://www.asp.net/ajax/documentation/live/tutorials/ConsumingWebServicesWithAJAXTutorial.aspx

Вот содержимое HomepageService.asmx, которое находится в корневой папке моего сайта:

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

Фрагмент главной страницы:

<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>

и вверху моей страницы я импортирую 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());
}

Мой web.config - беспорядок, но я буду рад опубликовать его ...

1 Ответ

0 голосов
/ 27 января 2012

Наконец-то все заработало. Вот как я это сделал. Не уверен, в чем проблема ... хотя, следуя описанному ниже процессу, добился цели.

Шаг 1. Выполните пошаговое руководство на http://msdn.microsoft.com/en-us/library/bb532367(v=vs.90).aspx,, используя новый проект веб-сайта.
Оно работает. Я назову это модельным проектом.

Шаг 2. Создайте файлы в моем существующем веб-приложении и скопируйте весь код из модельного проекта: - создал WebService HelloWorld.asmx (студия также предоставляет мне вложенный файл Helloworld.asmx.vb) в корневой папке моего проекта. Это отличается от модельного проекта, потому что когда я создал веб-сервис в этом проекте, он помещал .asmx в мою корневую папку, но вставлял .asmx.vb в папку App_Code. Не уверен, должен ли я перемещать это вручную или что-то? В прошлом, когда я пытался использовать папки App_Code или App_data с этим веб-приложением, все шло к черту ...

Шаг 3. Отредактируйте веб-сервис для работы с моим веб-приложением вместо веб-сайта: - Пространство имен Samples.Aspnet закомментировано, но не заменено другим пространством имен, поскольку мое приложение имеет пространство имен по умолчанию «Fubar», которое совпадает с именем проекта моего приложения.

Ниже приведен код в HelloWorld.asmx.vb в корневой папке моего веб-приложения:

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

А вот код в HelloWorld.asmx, также в корневой папке:

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

Шаг 4. Создайте js "HelloWorld.js", вставьте его в корневую папку, как в проекте модели, и вставьте код из проекта модели. Сделайте одно редактирование, чтобы соответствовать пространству имен моего приложения. Вот полученный код:

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();

Шаг 5. Добавьте код в мой тег ScriptManager на моей главной странице. Это соответствует коду модельного проекта в Default.aspx; тег ScriptManager ниже идентичен тегу в модельном проекте:

<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>

Шаг 5. Добавьте элементы управления на мою тестовую страницу, как в Default.aspx в модельном проекте:

   <div id="divTestWebServices">

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

Шаг 6. Запустите Fubar и перейдите к тестовой странице, затем нажмите кнопку.

Работает !!! Я не знаю, почему это не сработало раньше, но через три дня я готов идти дальше ...

...