8

アプリケーションから接続しているリモート WCF Web サービスがあります。

アプリケーションは、複数の IP アドレス (または複数の物理ネットワーク インターフェイス) を持つサーバー上で実行されている可能性があります。

通常のメトリック ルールに従って「優先」インターフェイスを使用するだけでなく、アウトバウンド リクエストに使用されている IP アドレスを制御できることを確認する必要があります。

この理由は、ソフトウェアの複数のコピーが同じマシンで実行され、それぞれが独自の操作のために特定の IP アドレスにバインドされ、接続先のリモート サービスは、接続に使用されているものを認識する必要があるためです。 (アドレスを間違えると間違ったサービスに接続することになるため)

従来の ASMX サービスGetWebRequest(Uri uri)では、サービス用に生成された部分クラスをオーバーライドすることでこれが行われます。しかし、WCFでこれを行う方法がまったくわかりません。

無関係なSO 投稿で、MVP の @JohnSaunders は、WCF で使用されるトランスポート メカニズム全体を引き継ぐことで、これが可能になる可能性があると示唆しました。しかし、私はまだこれを行う方法を理解していません。

4

3 に答える 3

4

これは難しい問題であり、WCF は特にうまく対応していないようです。

クライアントアドレスの問題を直接処理しているように見える .NET フレームワークの唯一のコンポーネントは、ServicePointクラスです。具体的にはBindIPEndPointDelegate、クライアント IP の選択方法を制御できるプロパティがあります。プロパティのドキュメントには次のものが含まれます。

一部の負荷分散技術では、クライアントが特定のローカル IP アドレスとポート番号を使用する必要があります。これは、IPAddress.Any(またはIPAddress.IPv6Anyインターネット プロトコル バージョン 6 の場合) および一時的なポートではありません。この要件BindIPEndPointDelegateを満たすことができます。

したがって、次のようなコードで URL に関連付けられたサービス ポイントを変更できるはずです。

var servicePoint =  ServicePointManager.FindServicePoint(
    new Uri("http://contoso.com/service.svc"));

servicePoint.BindIPEndPointDelegate =
    (sp, remote, retryCount) => new IPEndPoint(address, portNumber);

明らかに、この種のコードでは、クラスがプロトコルと、クライアントが通信するエンドポイント アドレスを認識している必要があります。このロジックは、クライアント チャネルに適用できるクライアント動作として設定するのが最も適切です。

于 2013-07-16T11:00:57.363 に答える
0

これを使用してください: 新しいクラス:

using System.Web.Services.Protocols;
using System.Windows.Forms;
using System;

public static class ExtensionMethods
{
    public static string ApplyServerURL(this SoapHttpClientProtocol service)
    {
        try
        {
            string name = service.GetType().Name;
            return string.Format("{0}{1}.svc", Settings.Instance.ServerAddress, name);
        }
        catch
        { return string.Empty; }
    }
}

そして今、このようなものです:

YourService us = new YourService();
us.Url = us.ApplyServerURL();
于 2013-07-16T10:29:50.140 に答える
0

メッセージ プロパティ (HttpRequestMessageProperty) を使用して、発信要求に HTTP ヘッダーを追加できます。プロパティが現在の「操作コンテキスト」に追加される「スコープ」を作成し、必要なすべてのヘッダーを含むプロパティをコンテキストの送信メッセージ プロパティに添付する必要があります。

これを見てください:

wcf の web 参照の代わりに、サービス参照を使用してオーバーライドする方法

于 2013-07-16T10:23:43.163 に答える