从javascript调用Winform托管WCF服务
我有一个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是消耗品?
你可以在任何地方托管WCF服务,只要:
- 启动并运行时,客户端连接到它
- 您指定的端口在客户端代码
- 您的防火墙没有按如果客户端和服务器运行在同一个盒子上,应该没问题。
它不必在IIS中运行。
无论您是自托管还是托管WCF服务的IIS,如果您的网站和服务不在同一地址(协议,服务器名称,端口),那么您将遇到XSS(跨站点脚本)限制。
The MSDN Documentation on ServiceReference.Path states:
“Path属性只能指向本地Web服务。换句话说,此属性只能指向Web服务在同一个域的支持ASP.NET AJAX的Web应用程序。路径可是相对的,应用程序相关的,相对于域的或绝对路径。“
的2点最好的选择是:
- 创建一个代理本地 - 也就是复制在你的本地Web服务的接口,然后在将请求从代码的Web服务。
- 更改服务以JSON格式返回结果。这将允许您添加动态脚本标记来检索结果。
这两个选项概述了here。
它竟然是用正确的服务配置非常简单:
<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字符串而不是空字符串作为数据)。