基本上要为您的 wcf 服务创建启用 Ajax 的端点以便能够从 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 服务注册为 Ajax 服务。
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" });
}