web-dev-qa-db-ja.com

Json.NetをWCFのデフォルトのシリアライザーとして設定する方法REST service

エンティティをSerialize/DeSerializeするときに、デフォルトのWCF DataContractSerializerの動作をオーバーライドして、代わりにJSON.NETを使用することは可能ですか?

シティエンティティを処理するために、次のサービス契約を結んでいます。設計上の理由から、CityエンティティにはIsReference = trueがあるため、デフォルトのDataContractSerializerでエラーが発生します。

「GET」メソッドの場合、JsonConvert.DeserializeObjectで状況を処理できますが、「PUT、POST、DELETE」メソッドでは、DataContractSerializerが優先され、IsReferenceエンティティの不満をシリアル化できません。

私はこれを見つけました Post IOperationBehaviorを実装し、独自のシリアライザーを提供しますが、Json.NETをこれと統合する方法がわかりません。これにはもっと直接的なアプローチが必要だと思います。

このシナリオに関するヘルプやガイダンス、または他のアプローチへのアドバイスをいただければ幸いです。

[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class CityService
{
    [Description("Get all Cities")]  
    [WebGet(UriTemplate = "")]
    public Message Cities()
    {

    }

    [Description("Allows the details of a single City to be updated.")]
    [WebInvoke(UriTemplate = "{code}", Method = "PUT")]
    public Message UpdateCity(string code, City city)
    {
    }
}

どうもありがとう

ホッサム

23
Hossam

拡張エンコーダーとシリアライザーの使用法( http://msdn.Microsoft.com/en-us/library/ms733092.aspx を参照)またはDataContractSerializerOperationBehaviorの使用法のようなWCFを拡張する他の方法は非常に興味深いです。しかし、あなたの特別な問題については、より簡単な解決方法があります。

すでにMessageタイプを使用して結果を返す場合は、WCF4を使用して、次のようにすることができます。

public Message UpdateCity(string code, City city)
{
    MyResponseDataClass message = CreateMyResponse();
    // use JSON.NET to serialize the response data
    string myResponseBody = JsonConvert.Serialize(message);
    return WebOperationContext.Current.CreateTextResponse (myResponseBody,
                "application/json; charset=utf-8",
                Encoding.UTF8);
}

エラー(HttpStatusCode.UnauthorizedHttpStatusCode.Conflictなど)の場合、またはHTTPステータスコード(HttpStatusCode.Createdなど)を設定する必要があるその他の状況では、引き続きWebOperationContext.Current.OutgoingResponse.StatusCodeを使用できます。

別の方法として、Streamを返すこともできます( http://blogs.msdn.com/b/carlosfigueira/archive/2008/04/17/wcf-raw-programming-model-web.aspxを参照 =および http://msdn.Microsoft.com/en-us/library/ms732038.aspxMessageの代わりに、MicrosoftJSONシリアライザーによる追加のデフォルト処理なしでデータを返します。 WCF4の場合、CreateStreamResponseの代わりにCreateTextResponsehttp://msdn.Microsoft.com/en-us/library/dd782273.aspx を参照)を使用できます。この手法を使用して応答を生成する場合は、ストリームに書き込んだ後、ストリーム位置を0に設定することを忘れないでください。

22
Oleg

特にJson.NETライブラリを使用したい理由はありますか? JSONを返したい場合は、WebGet属性とWebInvoke属性のResponseFormatプロパティを使用しないのはなぜですか?

[WebGet(UriTemplate = "", ResponseFormat = WebMessageFormat.Json)]

ほとんどの場合、これで十分です。どのバージョンのWCFを実行していますか?実際のタイプではなくメッセージタイプを返す理由は何ですか?

1

サービスの動作に関するサービスWeb構成で定義します。

<endpointBehaviors>
   <behavior name="restfulBehavior">
      <webHttp defaultOutgoingResponseFormat="Json" defaultBodyStyle="Wrapped" automaticFormatSelectionEnabled="False" />
      <!--<enableWebScript />-->
   </behavior>
</endpointBehaviors>

またはインターフェースの運用契約

[OperationContract]
[WebInvoke(Method = "GET", 
           UriTemplate = "/advertisements/{app_id}/{access_token}/{genero}/{age}", 
           ResponseFormat = WebMessageFormat.Json,
           RequestFormat = WebMessageFormat.Json, 
           BodyStyle = WebMessageBodyStyle.Wrapped)]
0
Jailson Evora