基本上创建Ajax启用端点的WCF服务有打电话需要从你的JavaScript方法执行以下能力:
1)添加AspNetCompatibilityRequirements到WCF服务的定义,所以它看起来像下面的代码:
namespace Test
[ServiceContract(Namespace = "Test.Services")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class TestService : IMyWCFServer
{
// To use HTTP GET, add [WebGet] attribute. (Default ResponseFormat is WebMessageFormat.Json)
// To create an operation that returns XML,
// add [WebGet(ResponseFormat=WebMessageFormat.Xml)],
// and include the following line in the operation body:
// WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml";
public bool UnSubscribe()
{
return true;
}
public bool Subscribe()
{
return false;
}
}
注:命名空间也是必不可少的,因为它会通过ScriptManager的用来生成客户端代理服务后,将被注册它。
2)然后添加[YourServiceName] .SVC与以下定义Asp.Net Web应用程序项目文件:
<%@ ServiceHost
Language="C#" Debug="true"
Service="Test.TestService "
Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory" %>
该文件足以注册WCF服务作为阿贾克斯之一。
3)然后通过添加以下到您想要使用的服务页面(或母版页)注册脚本管理这个服务:
<asp:ScriptManagerProxy runat="server" ID="ScriptManagerProxy">
<Services>
<asp:ServiceReference Path="~/[RelativePathToSVCFile].svc" />
</Services>
</asp:ScriptManagerProxy>
然后,你就可以从JavaScript调用服务就像下面这个例子:
var wasSubscribed = Test.Services.TestService.Subscribe();
例如一些更多的信息,可以在本文中找到:http://dotnetslackers.com/articles/ajax/JSON-EnabledWCFServicesInASPNET35.aspx
编辑: 有几种方法可以通过编程方式向脚本管理器添加脚本引用。第一个是ScriptManager控件本身也可用于将wcf服务注册为脚本服务。但要获得当前的脚本管理器实例,您需要参考当前的页面实例。所以,下面的代码显示了如何从代码来完成后面的类中的任何页面或服务器控件的:
protected void Page_Load(object sender, EventArgs e)
{
ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page);
scriptManager.Services.Add(new ServiceReference { Path = "[RelativePathToSVCFile].svc" });
}
这是例子如何从代码编程方式添加的ScriptManagerProxy背后类中的任何页面或服务器控件。此方法要求您有权访问控件页面或服务器控件的集合:
/// <summary>
/// Called by the ASP.NET page framework to notify server controls that use composition-based implementation to create any child controls they contain in preparation for posting back or rendering.
/// </summary>
protected override void CreateChildControls()
{
base.CreateChildControls();
ScriptManagerProxy scriptManagerProxy = new ScriptManagerProxy { ID = "ScriptManagerProxy" };
this.Controls.Add(scriptManagerProxy);
scriptManagerProxy.Services.Add(new ServiceReference { Path = "[RelativePathToSVCFile].svc" });
}
您是否尝试在ASP.NET应用程序中调用**当前服务**?我认为你只需要在客户端(在这种情况下是Web应用)配置服务,就像在控制台和WPF应用上配置服务一样。另一方面,如果您想通过HTTP公开相同的服务,那么您将需要在主机Web应用程序中配置新的端点。 – Jupaol