我正在尝试使用WCF服务来实现MS Ajax AutoCompleteExtender完成列表。我尝试了两种选择。如果我在我的网站项目中添加WCF服务,AutoCompleteExtender会通过POST调用它,它可以正常工作。
然后我决定创建一个单独的WCF应用程序,并将我支持AJAX的WCF服务添加到新应用程序中。我还复制了有关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>
所以,我有两个问题:
我上传了sample solution来重现问题。
答案 0 :(得分:3)
为什么它在第二个不起作用 情况?
AutoCompleteExtender使用AJAX来获取数据。不允许跨域AJAX请求。您的网络服务托管在localhost:4227
上,您的网络应用程序托管在localhost:XXXX
,其中XXXX
与4227不同。
有关Same origin policy的更多信息。