エンティティを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)
{
}
}
どうもありがとう
ホッサム
拡張エンコーダーとシリアライザーの使用法( 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.Unauthorized
やHttpStatusCode.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.aspx )Message
の代わりに、MicrosoftJSONシリアライザーによる追加のデフォルト処理なしでデータを返します。 WCF4の場合、CreateStreamResponse
の代わりにCreateTextResponse
( http://msdn.Microsoft.com/en-us/library/dd782273.aspx を参照)を使用できます。この手法を使用して応答を生成する場合は、ストリームに書き込んだ後、ストリーム位置を0に設定することを忘れないでください。
特にJson.NETライブラリを使用したい理由はありますか? JSONを返したい場合は、WebGet属性とWebInvoke属性のResponseFormatプロパティを使用しないのはなぜですか?
[WebGet(UriTemplate = "", ResponseFormat = WebMessageFormat.Json)]
ほとんどの場合、これで十分です。どのバージョンのWCFを実行していますか?実際のタイプではなくメッセージタイプを返す理由は何ですか?
サービスの動作に関するサービス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)]