2

1 つのメソッドがすべての要求をキャッチする WCF サービスを作成しようとしています。スタンドアロンの実行可能ファイル内でホストすることを計画してください。契約は次のとおりです。

[ServiceContract]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple, AddressFilterMode = AddressFilterMode.Any)]
public class Proxy
{
    [WebInvoke(UriTemplate = "*", Method = "*")]
    public string Test(Stream input)
    {
        return "Test";
    }
}

ホスティングコードは次のとおりです。

static void Main(string[] args)
{
    var uri = new Uri("http://localhost:2535/");
    var binding = new WebHttpBinding();

    var host = new ServiceHost(new Proxy(), uri);
    host.AddServiceEndpoint(typeof(Proxy), binding, uri);
    host.Open();
    Console.ReadKey();
}

しかし、ブラウザを に向けると、localhost:2535サービスに関する情報と、メタデータが有効になっていないという事実が表示されます。そして、localhost:2535/bla-bla-bla/エラーのようなものが発生すると:

アクション '' のメッセージは、EndpointDispatcher での ContractFilter の不一致により、受信側で処理できません。これは、コントラクトの不一致 (送信者と受信者の間のアクションの不一致) または送信者と受信者の間のバインディング/セキュリティの不一致が原因である可能性があります。送信者と受信者が同じコントラクトと同じバインド (メッセージ、トランスポート、なしなどのセキュリティ要件を含む) を持っていることを確認します。

率直に言って、何が欠けているのかわかりません... 正しい軌道に戻るのを手伝ってくれてとても感謝しています。

編集:WebHttpBehaviorエンドポイントに動作を明示的に追加することで解決しました。結果のコードは次のようになります。

static void Main(string[] args)
{
    var uri = new Uri("http://localhost:2535/");
    var binding = new WebHttpBinding();

    var host = new ServiceHost(new Proxy(), uri);
    host.AddServiceEndpoint(typeof(Proxy), binding, uri).Behaviors.Add(new WebHttpBehavior());
    host.Open();
    Console.ReadKey();
}

なぜそのように機能するのか、より詳細な説明をまだ探しています...

4

3 に答える 3

1

このように、エンドポイントの動作 WebHttpBehavior に追加してみてください

host.AddServiceEndpoint(typeof(Proxy), binding, uri).Behaviours.Add(new WebHttpBehavior());
于 2013-01-15T15:09:42.013 に答える
0

メタデータ交換を有効にするには、ServiceMetadataBehaviorそのように追加する必要があります

ServiceMetadataBehavior serviceBehaviour = new ServiceMetadataBehavior() { HttpGetEnabled = true, HttpGetUrl = new Uri(String.Format("{0}/mex", endpointUrl)) }; 
Host.Description.Behaviors.Add(serviceBehaviour);

次に、localhost:2535/mex を使用してサービス メタデータを取得します。成功した場合は、Test メソッドがメタデータに含まれているかどうかを確認してください。失敗した場合は、WCF トレースを構成して、より詳細でわかりやすいエラー メッセージを取得してください。また、OperationContract 属性でメソッドをマークしたことを確認してください。

それが役に立てば幸い。

于 2013-01-15T14:57:06.657 に答える
0

ServiceContractサービスを実装するクラスで属性が直接定義されているのは少し奇妙に見えます。通常、サービスを定義するインターフェースでこれを定義します。例:-
MSDN ServiceContractAttribute

于 2013-01-15T13:17:15.837 に答える