从javascript调用Winform托管的WCF服务

时间:2010-10-10 18:51:40

标签: javascript winforms wcf asp.net-ajax

我有一个带有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使用?

3 个答案:

答案 0 :(得分:1)

无论您是自托管还是IIS托管WCF服务,如果您的网站和服务不在同一地址(协议,服务器名称,端口),那么您将遇到XSS(跨站点脚本)限制。< / p>

The MSDN Documentation on ServiceReference.Path states:

“Path属性只能指向本地Web服务。换句话说,此属性只能指向与启用AJAX的ASP.NET Web应用程序位于同一域中的Web服务。路径可以是相对的,应用程序 - 相对,域相对或绝对路径。“

两个最佳选择是:

  1. 在本地创建代理 - 也就是说,复制本地Web中服务的接口,然后从代码中将请求移交给Web服务。
  2. 更改服务以JSON格式返回结果。这将允许您添加动态脚本标记以检索结果。
  3. 这两个选项都列出了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中运行。