1

WCFサービスは別のサービスを返すことができますか?

コード:

[ServiceContract]
public interface IServiceA
{
    [OperationContract]
    IServiceB GetServiceB();

[ServiceContract]
public interface IServiceB
{


public class ServiceA : IServiceA
{
    public IServiceB GetServiceB()
    {
        return new ServiceB();
    }

そして、ServiceBを呼び出すServiceAをアクティブ化するフォーム:

public partial class Form1 : Form
{
    private void button1_Click(object sender, EventArgs e)
    {
        ServiceReference1.ServiceAClient client = new
            ServiceReference1.ServiceAClient();
        IServiceB serviceB = client.GetServiceB();

もちろん、GetServiceB()は次のようにキャストするときにサービスではなくオブジェクトを返すため、これを行うことはできません。

  IServiceB serviceB = (ServiceB) client.GetServiceB();

CommunicationExceptionが発生します:「既存の接続がリモートホストによって強制的に閉じられました」

4

2 に答える 2

2

いいえ、これを行うことはできません。クライアントには、ServiceBのエンドポイントの構成データが必要です。

これにアプローチする別の方法は、ServiceAにServiceBを呼び出させることです。これにより、クライアントはServiceAと対話するだけで済みます。

于 2013-02-28T23:16:40.970 に答える
1

はい、できません。

リモート参照を渡すためのこの単純さは、.NETRemotingの最大の危険の1つでもあります。多くのアーキテクチャでは、非常に限定され制御されている場合を除いて、リモート参照の転送は望ましくありません。[Serializable]オブジェクトの代わりにMarshalByRefObjectを渡すと、誤って、通常、パフォーマンスとスケーラビリティが大幅に低下します。結局のところ、各メソッド呼び出しはネットワーク上を移動する必要があり、複数の都市、国、または大陸にまたがる可能性があります。

..。

WCFでは、リモートサービスへの参照を渡すことができますが、そうすることについては非常に明確にする必要があります。それは通常、非常に明確な意図がなければ起こり得ません。

インゴ_

そのため、サービスインスタンスacrоssクライアントを共有する機能(共有可能なサービス)がありました。ShareableはWCFのBeta1またはBeta2にありましたが、製品の最終バージョンがリリースされる前にカットされました。しかし、記事には次のように書かれています。

.NET RemotingベースのIRemoteFactoryインターフェイスを再利用して、WCFと互換性があるように注釈を付けることができます

参照(クレントオブジェクトグラフ)の部分を保持することも興味深いです。

現在、InstanceContextMode.Single(およびカスタムクライアント-サービス-クライアント会話ロジック)またはIInstanceContextProviderを使用して、クライアント(「共有インスタンス」)間で対話できます。

于 2013-03-01T11:37:10.153 に答える