Вызов приложения WCF с поддержкой Ajax из AutoCompleteExtender - PullRequest
1 голос
/ 22 января 2010

Я пытаюсь использовать службу WCF для выполнения списка завершения MS Ajax AutoCompleteExtender. Я попробовал две альтернативы. Если я добавляю сервис WCF в свой проект веб-сайта, AutoCompleteExtender вызывает его через POST, и он работает нормально.

Затем я решил создать отдельное приложение WCF и добавить свою службу WCF с поддержкой AJAX в новое приложение. Я также скопировал часть Web.config моего сайта, касающуюся servicemodel. И это не работает! Прежде всего, автозаполнение вызывает услугу GET, а не POST. Я изменил WebInvokeAttribute и WebGet моего сервиса, чтобы принять GET. Теперь служба отправляет правильный ответ расширителю (я наблюдал это с помощью Fiddler), но расширитель не заполняет список завершения.

Расширитель определяется следующим образом (act - это тег для AjaxControlToolkit):

<form id="form1" runat="server">
<div>
    <asp:TextBox ID="TextBox1" runat="server" autocomplete = "off"></asp:TextBox>
    <act:AutoCompleteExtender ID="TextBox1_AutoCompleteExtender" runat="server" 
        DelimiterCharacters="" Enabled="True" ServiceMethod="GetNames" 
        ServicePath="http://localhost:4227/Service1.svc" TargetControlID="TextBox1">
    </act:AutoCompleteExtender>
    <asp:Button ID="Button1"
        runat="server" Text="Button" />
</div>
 <act:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server">
</act:ToolkitScriptManager>
</form>

Служба WCF работает на порте 4227. Она работает в Visual Studio. В первом случае ServicePath равен Service1.svc.

Web.Config определяет sevicemodel следующим образом:

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    <services>
        <service name="WcfService1.Service1" behaviorConfiguration="WcfService1.Service1Behavior">
            <endpoint address="" behaviorConfiguration="WcfService1.Service1AspNetAjaxBehavior" binding="webHttpBinding" contract="WcfService1.Service1" />
        </service>
    </services>
    <behaviors>
        <endpointBehaviors>
            <behavior name="WcfService1.Service1AspNetAjaxBehavior">
                <enableWebScript/>
            </behavior>
        </endpointBehaviors>
        <serviceBehaviors>
            <behavior name="WcfService1.Service1Behavior">
                <serviceMetadata httpGetEnabled="true"/>
                <serviceDebug includeExceptionDetailInFaults="false"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>

Итак, у меня есть два вопроса:

  1. Почему в этом случае автозаполнение использует разные глаголы для отправки запроса?
  2. Почему это не работает во втором случае?

Я загрузил пример решения для воспроизведения проблемы.

1 Ответ

3 голосов
/ 26 января 2010

Почему это не работает во втором случай

AutoCompleteExtender использует AJAX для извлечения данных. Междоменные запросы AJAX не допускаются. Ваш веб-сервис размещен на localhost:4227, а ваше веб-приложение размещено на localhost:XXXX, где XXXX отличается от 4227.

Подробнее о Одинаковая политика происхождения .

...