0

次のような操作を行う WCF REST サービスがあります。

[OperationContract]
[WebInvoke(UriTemplate = "/User", BodyStyle = WebMessageBodyStyle.Bare, Method = "POST", RequestFormat = WebMessageFormat.Json)]
void User(User user);

これを Fiddler から呼び出すと、次のように Content-Type="application/json" を指定すると正常に動作します。

Content-Type: application/json
Host: localhost:58150
Content-Length: 172
Expect: 100-continue

しかし、Content-Type を除外すると、リクエストの本文を XML として処理しようとするため、エラー 400 が発生します。これは非常に面倒です。RequestFormat = WebMessageFormat.Json を設定すると、Content-Type を指定する必要がなくなると本当に思いますが、そうではありません。実際のところ、「RequestFormat」をドロップしても何も変わりません。WebMessageBodyStyle の「ラップ」も試しましたが、DTO は null を通過します。

明確にするために、これは、投稿の本文でも XML を使用する (および Content-Type を省略する) 場合に発生します...したがって、私が本当に達成したいのは次のとおりです。

WebInvoke を使用するときに WCF Rest メソッドを Content-Type を必要としないようにするにはどうすればよいですか (WCF が自動的に判断することを期待します)。

これは私を夢中にさせています。助けてください。

4

2 に答える 2

1

WebHttpBinding に WebContentTypeMapper を追加する必要があります。その中で、WCF ランタイムに、提供された (または想定された) コンテンツ タイプの MIME 値がどの WebContentFormat であるかを伝えることができます。通常、content-type ヘッダーなしで POST を受信すると、これは「application/x-www-form-urlencode」になります (multipart/form-data または text/plain も発生する可能性があるので注意してください)。これがJsonまたはXml(または必要なもの)であることをWCFに伝えるだけで、うまくいきます(ミレージは異なる場合があります)。

    public class YourContentTypeMapper : WebContentTypeMapper
{
    public override WebContentFormat GetMessageFormatForContentType(string contentType)
    {
        if (contentType == "application/x-www-form-urlencode")
        {
            return WebContentFormat.Json; // assuming this is wanted
        }
        else
        {
            return WebContentFormat.Default;
        }
    }
}

WebHttpBinding で ContentTypeMapper をクラスのインスタンスに設定するだけです (これは、構成ファイルでも contentTypeMapper 属性を使用したバインディングでも実行できます)。

var binding = new WebHttpBinding();
binding.ContentTypeMapper = new YourContentTypeMapper();

詳細情報 => https://msdn.microsoft.com/en-us/library/bb943479(v=vs.110).aspx

于 2016-02-24T23:49:26.377 に答える
0

automaticFormatSelectionEnabledエンドポイントの動作を trueに設定しようとしましたか?

この属性は NET 4.0 に固有のものであることを考慮してください。http の Accept ヘッダーに基づいて応答メッセージをフォーマットするために使用したことを覚えています。

シナリオを再現しようとはしていませんが、この公式ドキュメントのリンクを読むと、次のように記載されています。

要求メッセージに Accept ヘッダーが含まれている場合、Windows Communication Foundation (WCF) インフラストラクチャは、サポートする型を検索します。Accept ヘッダーがそのメディア タイプの優先度を指定している場合、それらは優先されます。Accept ヘッダーに適切な形式が見つからない場合は、要求メッセージの content-type が使用されます。適切な content-type が指定されていない場合、操作のデフォルトのフォーマット設定が使用されます。

automaticFormatSelectionEnabled の設定方法の msdn の例を次に示します。

<behaviors>
  <endpointBehaviors>
    <behavior>
      <webHttp automaticFormatSelectionEnabled="true" />
    </behavior>
  </endpointBehaviors>
</behaviors>
于 2013-06-13T03:16:15.283 に答える