我有一个带有Ajax Web端点的Winform托管WCF服务。
我还有一个单独的ASP.NET项目,页面上有ScriptManager组件。
我的问题是,如果我使用javascript从ASP.NET应用程序的客户端对我的Winform托管服务进行服务调用,该工作是否有效?
我的ASP.NET默认页面如下所示:
<script type="text/javascript">
function Button1_onclick() {
// ????How to call a service method?????
}
</script>
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Services>
<asp:ServiceReference Path="http://localhost:8000/web" /> //My winform hosted service
</Services>
</asp:ScriptManager>
或者我是否必须在IIS中托管我的服务以供AJAX使用?
答案 0 :(得分:1)
无论您是自托管还是IIS托管WCF服务,如果您的网站和服务不在同一地址(协议,服务器名称,端口),那么您将遇到XSS(跨站点脚本)限制。< / p>
The MSDN Documentation on ServiceReference.Path states:
“Path属性只能指向本地Web服务。换句话说,此属性只能指向与启用AJAX的ASP.NET Web应用程序位于同一域中的Web服务。路径可以是相对的,应用程序 - 相对,域相对或绝对路径。“
两个最佳选择是:
这两个选项都列出了here。
答案 1 :(得分:1)
通过正确的服务配置,结果非常简单:
<endpoint address="Web/" binding="webHttpBinding" contract="IMyService"
behaviorConfiguration="WebBehavior"/>
<!-- ... -->
<endpointBehaviors>
<behavior name="WebBehavior">
<webHttp defaultOutgoingResponseFormat="Json" defaultBodyStyle="Wrapped" />
</behavior>
</endpointBehaviors>
我还在服务合同中添加了WebInvoke
属性:
[WebInvoke(Method = "POST")]
public interface IMyService {
// ...
}
使用此配置,您只需使用浏览器即可调用服务方法。所以javascript只需要对url进行POST HTTP查询,这是一项简单的任务,不需要任何ASP.NET ServiceManager的东西。 jQuery示例:
<script type="text/javascript">
function Button1_onclick() {
$.ajax({
type: "POST",
url: "http://localhost:8000/web/",
data: "",
contentType: "application/json; charset=utf-8",
dataType: "json",
processdata: true
success: function(msg) { /*...*/ },
error: /*..error handler..*/
});
}
</script>
在我的情况下,我不必将任何参数传递给服务(事实上,我的方法被标记为单向方法)。但是添加参数只会使事情变得复杂(你可以传入一个json字符串而不是一个空字符串作为数据)。
答案 2 :(得分:0)
您可以在任何地方托管您的WCF服务,只要:
它不必在IIS中运行。