2

DuplexChannelFactoryと名前付きパイプを使用している単純なWCFサーバーがあります。コンソールアプリケーションから呼び出すことも、WPFアプリケーションから呼び出すこともできます。ただし、ASP.NETから同じWCFサーバーを呼び出しても、console \ WPFアプリから呼び出すことはできますか?

次のエンドポイントを使用しています。

[ServiceContract(SessionMode = SessionMode.Required,
  CallbackContract = typeof(IMyWCFClient))]
public interface IMyWCFServer
{
    [OperationContract]
    bool Subscribe();
    [OperationContract]
    bool UnSubscribe();
}

これを更新してASP.NETから呼び出し可能にすることはできますか?

4

2 に答える 2

5

はい、コンソール、WPF、ASP.NETでWCFサービスを呼び出すことができます。endpointただし、最初に適切なものを作成する必要があります。

方法:構成でサービスエンドポイントを作成する

于 2012-10-14T22:08:53.393 に答える
2

基本的に、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" });
    }
于 2012-10-20T20:53:36.853 に答える