2

サービスが単一のアプリケーション エンドポイントを公開する場合にのみ (相互運用性の理由から) 正しく機能する WCF のカスタム動作を作成しています。

IServiceBehavior.Validateこのメソッドを使用して、サービスによって公開されているアプリケーション エンドポイントが 1 つだけであることを確認できるようにしたいと考えています。現在、私は次のことを行っています:

public void Validate(
    ServiceDescription serviceDescription, 
    ServiceHostBase serviceHostBase)
{
    if (serviceDescription.Endpoints.Count > 1)
    {
        throw new InvalidOperationException();
    }
}

serviceDescription.Endpoints残念ながら、エンドポイントを含むすべてのエンドポイントが含まれていIMetadataExchangeます。これにより、完全に有効なサービスで検証が失敗します。

私が必要としているのは、アプリケーション (非インフラストラクチャ) エンドポイントのみをカウントする方法ですが、WCF 自体がどれがどれであるかを判断する方法を見つけることができません。

4

2 に答える 2

2

この問題を回避しながら、悪名高い問題を再現することができました。

サービス 'Service' にはアプリケーション (非インフラストラクチャ) エンドポイントがありません。これは、アプリケーションの構成ファイルが見つからなかったか、サービス名に一致するサービス要素が構成ファイルに見つからなかったか、サービス要素にエンドポイントが定義されていなかったためである可能性があります。

例外は、例外がスローされる原因となるオブジェクトでメソッドEnsureThereAreNonMexEndpointsが呼び出されたことを示しています。System.ServiceModel.Description.DispatchBuilder

このメソッドを Reflector で掘り下げて、同等の機能を表現する次の実装をリバース エンジニアリングしました。

private void EnsureThereAreNonMexEndpoints(ServiceDescription description)
{
    foreach (ServiceEndpoint endpoint in description.Endpoints)
    {
        if (endpoint.Contract.ContractType != typeof(IMetadataExchange))
        {
            return;
        }
    }

    throw InvalidOperationException();
}

WCF によってインフラストラクチャと見なされる唯一のエンドポイントはIMetadataExchange. は。

知れば知るほど。

于 2010-10-25T17:07:40.573 に答える
1

この記事で概説したように、私は過去にこれを行いました。

于 2010-10-25T16:54:14.507 に答える