1

我正在尝试使用 WCF 服务来完成 MS Ajax AutoCompleteExtender 完成列表。我尝试了两种选择。如果我在我的网站项目中添加 WCF 服务,AutoCompleteExtender 通过 POST 调用它并且它工作正常。

然后我决定制作一个单独的 WCF 应用程序并将我的启用 AJAX 的 WCF 服务添加到新应用程序中。我还复制Web.config了我网站中有关servicemodel. 而且它不起作用!首先,自动完成调用服务使用GET,而不是POST。我改变WebInvokeAttributeWebGet接受我的服务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 以这样的方式定义服务模型:

<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. 为什么它在第二种情况下不起作用?

我上传了一个示例解决方案来重现问题。

4

1 回答 1

3

为什么它在第二种情况下不起作用?

AutoCompleteExtender 使用 AJAX 来获取数据。不允许跨域 AJAX 请求。您的 Web 服务托管在localhost:4227并且您的 Web 应用程序托管在localhost:XXXX不同于XXXX4227 的位置。

有关同源政策的更多信息。

于 2010-01-26T14:30:49.853 回答