2010-10-10 80 views
2

我有一个Winform托管WCF服务与Ajax Web端点。从javascript调用Winform托管WCF服务

我也有一个单独的ASP.NET项目,ScriptManager组件在页面上。

我的问题是,如果我从ASP.NET应用程序的客户端使用javascript对我的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

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

  • 启动并运行时,客户端连接到它
  • 您指定的端口在客户端代码
  • 您的防火墙没有按如果客户端和服务器运行在同一个盒子上,应该没问题。

它不必在IIS中运行。

1

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

The MSDN Documentation on ServiceReference.Path states:

“Path属性只能指向本地Web服务。换句话说,此属性只能指向Web服务在同一个域的支持ASP.NET AJAX的Web应用程序。路径可是相对的,应用程序相关的,相对于域的或绝对路径。“

的2点最好的选择是:

  1. 创建一个代理本地 - 也就是复制在你的本地Web服务的接口,然后在将请求从代码的Web服务。
  2. 更改服务以JSON格式返回结果。这将允许您添加动态脚本标记来检索结果。

这两个选项概述了here

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