従来のシステムの置き換え&ServiceStack +カスタムシリアル化を使用して新しいサーバーコードの作成
-
13-12-2019 - |
質問
ServiceStackを使用して放棄して新しいものを開発したいレガシサーバーコードを持っています。既存のクライアントは.NETで書かれていません。クライアント側で.NETをまったく使用する予定です。
クライアントとサーバー間のデータはXMLとJSONを使用して交換されています.MOMENTでJSONは応答の戻りフォーマットとしてのみ使用されます(利用可能な一部のサービスの場合)。XML形式は、サーバーソリューションの最初のバージョンが数年前に作成されたときに定義されました。私たちはそれを変えたくありません。
ServiceStackを使用して新しいRESTFUL WebServicesを構築する方法を使用します。これは、過去に設計されたフォーマットにデータをシリアル化して逆シリアル化することができます(クライアントはC#/ Netで書かれていないことに注意してください)。シリアル化と逆シリアライゼーションの両方にコントロールする必要があります。DTOを使用し、それでもこれらのオブジェクトはシリアル化/逆シリアル化されているのですか?
解決
要求/応答フィルタを介してカスタムロジックを追加する
追加と応答フィルタを追加する方法を確認するサービスの前後のカスタムロジックが呼び出されます。 リクエスト/レスポンスfilterattributes を介してこれらのフィルタを追加するのが最善です。強い>マークこれらのフィルタが適用される必要があるサービスだけです。
リクエストフィルタの問題は、カスタムデシリアル化ロジックを追加するのに遅すぎるリクエストDTOへの逆シリアル化の後に起こります。これを回避するには、Apphostにカスタムリクエストバインダーを登録できます。
base.RegisterRequestBinder<MyRequest>(httpReq => ... requestDto);
.
これにより、IHTTPRequestオブジェクトにアクセスし、カスタムの逆シリアル化ロジックを自分で追加できます。もう1つのオプションは、リクエスト自体を逆シリアル化し、代わりにHTTPRequest InputStreamを挿入しようとしないようにServiceStackに指示することです。
public class Hello : IRequiresRequestStream {
Stream RequestStream { get; set; }
}
.
これらの例は、ServiceStackのシリアライゼーションとデ-Serialization Wikiページにあります。 。
独自のカスタムメディアタイプ
を登録する>強い型付けDTOを返すことができるが特定の要求の出力を変更することができる別の選択肢は、 Northwind vCardカスタムメディアタイプの例、例えば:
public static void Register(IAppHost appHost)
{
appHost.ContentTypeFilters.Register( "text/x-vcard", SerializeToStream, DeserializeFromStream);
}
...
public static void SerializeToStream(IRequestContext requestContext, object response, Stream stream)
{
var customerDetailsResponse = response as CustomerDetailsResponse;
using (var sw = new StreamWriter(stream))
{
if (customerDetailsResponse != null)
{
WriteCustomer(sw, customerDetailsResponse.Customer);
}
var customers = response as CustomersResponse;
if (customers != null)
{
customers.Customers.ForEach(x => WriteCustomer(sw, x));
}
}
}
.
これは、さまざまなコンテンツタイプの下でカスタムXML応答をマウントできる場合は、良いオプションです。 Application / V-XML だから既存のXML形式/エンドポイントと競合しません。 HTTPクライアントの上のContentTypeを使用すると、 format= v-xml を使用してこのカスタム実装を呼び出すことも、HTTPヘッダー: accept:Application / V-XML 。
組み込みのXML ContentTypeを上書きしたい場合は、SERIALIZESTREAMおよびDESERIALIZESTREAMメソッドのオリジナルのXMLSerializerの実装に立ち返します。
は、あなた自身のカスタムihttphandler もう1つのオプションは、ServiceStackを完全にバイパスすることであり、代わりにあなたのApphostのservicestackのconfigにそれを登録することによってあなた自身のカスタムIHttpRequestハンドラで要求を処理することです:
SetConfig(new EndpointHostConfig {
RawHttpHandlers = {
httpReq => return IsLegacyMatch(httpReq) ? new LegacyXmlHandler() : null
}
});
.
null (すなわち、任意のハンドラ)はServiceStackを渡します。
SetConfig(new EndpointHostConfig {
RawHttpHandlers = {
httpReq => return IsLegacyMatch(httpReq) ? new LegacyXmlHandler() : null
}
});