【问题标题】:Calling a Winform hosted WCF service from javascript从 javascript 调用 Winform 托管的 WCF 服务
【发布时间】:2010-10-10 18:51:39
【问题描述】:

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

【问题讨论】:

    标签: javascript winforms wcf asp.net-ajax


    【解决方案1】:

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

    The MSDN Documentation on ServiceReference.Path states:

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

    两个最佳选择是:

    1. 在本地创建代理 - 即在本地 Web 中复制服务接口,然后将请求从代码移交给 Web 服务。
    2. 更改服务以 JSON 格式返回其结果。这将允许您添加动态脚本标记来检索结果。

    here 列出了这两个选项。

    【讨论】:

      【解决方案2】:

      使用正确的服务配置非常简单:

      <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 字符串而不是一个空字符串作为数据)。

      【讨论】:

        【解决方案3】:

        您可以在任何地方托管您的 WCF 服务,只要:

        • 客户端连接到它时它已启动并运行
        • 您在客户端代码中指定端口
        • 您的防火墙不会阻止使用的端口(如果客户端和服务器在同一个机器上运行,应该没问题)

        它不必在 IIS 中运行。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-07-16
          • 2011-11-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多