基本的に、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.NetWebアプリケーションプロジェクトに追加します。
<%@ ServiceHost
Language="C#" Debug="true"
Service="Test.TestService "
Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory" %>
このファイルは、WCFサービスをAjaxサービスとして登録するのに十分です。
3)次に、サービスを使用するページ(またはマスターページ)に以下を追加して、このサービスをScriptManagerに登録します。
<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
編集:プログラムでスクリプトマネージャーにスクリプト参照を追加する方法はいくつかあります。1つ目は、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" });
}