2016-12-01 2 views
0

私は次のようにサービス・スタックAPIにJsonServiceClientとパッチを実行しようとしている:のContent-Typeが「アプリケーション/ JSON-パッチ+ JSON」でなければなりませんJsonServiceClient ServiceStack

var patchRequest = new JsonPatchRequest 
{ 
    new JsonPatchElement 
    { 
     op = "replace", 
     path = "/firstName", 
     value = "Test" 
    } 
}; 
_jsonClient.Patch<object>($"/testurl/{id}", patchRequest); 

をしかし、私は取得しています次のエラー:

Content-Type must be 'application/json-patch+json'

エラーはクリアされています。 JsonServiceClientのリクエストを実行する前にコンテンツタイプを変更する方法はありますか?

これはServiceStack APIの要求POCOは以下のとおりです。

[Api("Partial update .")] 
[Route("/testurl/{Id}”, "PATCH")] 
public class PartialTest : IReturn<PartialTestRequestResponse>, IJsonPatchDocumentRequest, 
    IRequiresRequestStream 
{ 
    [ApiMember(Name = “Id”, ParameterType = "path", DataType = "string", IsRequired = true)] 
    public string Id { get; set; } 

    public Stream RequestStream { get; set; } 
} 

public class PartialTestRequestResponse : IHasResponseStatus 
{ 
    public ResponseStatus ResponseStatus { get; set; } 
} 

サービスの実装:私はMarvin.JsonPatch V 1.0.0ライブラリを使用してい

public object Patch(PartialTest request) 
    { 
     var dbTestRecord = Repo.GetDbTestRecord(request.Id); 

     if (dbTestRecord == null) throw HttpError.NotFound("Record not found."); 

     var patch = 
      (JsonPatchDocument<TestRecordPoco>) 
       JsonConvert.DeserializeObject(Request.GetRawBody(), typeof(JsonPatchDocument<TestRecordPoco>)); 

     if (patch == null) 
      throw new HttpError(HttpStatusCode.BadRequest, "Body is not a valid JSON Patch Document."); 

     patch.ApplyTo(dbTestRecord); 
     Repo.UpdateDbTestRecord(dbTestRecord); 
     return new PartialTestResponse(); 
    } 

+0

これはServiceStackのエラーではありません。あなたの投稿を更新して、ServiceStackサービスの実装を含めてください。 – mythz

答えて

1

ServiceStack内でエラーではないため、例外がどこから来ているのかはまだ分かりません。このエラーをスローするカスタムフォーマットまたはフィルタを登録している場合は、エラーの原因を特定する完全なStackTraceと同様に、そのimpl(またはそのリンク)も含めてください。

Patch<object>を返すことはありません。object戻り値の型は、逆シリアル化する応答の種類を指定していないためです。

_jsonClient.Patch(new PartialTest { ... }); 

IReturn<PartialTestRequestResponse>レスポンスDTOにレスポンスをデシリアライズしようとします:あなたはIReturn<T>マーカーを持っているので、あなただけのリクエストDTOを送信することができます。

var bytes = request.Url.SendBytesToUrl(
    method: HttpMethods.Path, 
    requestBody: jsonPatchBytes, 
    contentType: "application/json-patch+json", 
    accept: MimeTypes.Json); 

:しかし、あなたの要求としてDTOは、例えば、あなたは可能性がHTTP Utilsのような生のHTTPクライアントを使用したい場合には、通常のリクエストDTO、に準拠していない未知のバイトを期待していると言っていますIRequiresRequestStream実装します

_jsonClient.RequestFilter = req => 
    req.ContentType = "application/json-patch+json"; 

しかし、それは、このような非JSONサービス要求のためのHTTP Utilsのような低レベルのHTTPクライアントを使用する方が適切です:あなたは、例えば、要求フィルターを使用してJSONクライアントのContentTypeをを変更することができます。

+0

あなたが正しいです、それはエラーを投げているカスタム型付きリクエストフィルタです、SeviceStackではありません –

+1

このフィルタはIjsonPatchDocumentRequestインターフェイスを実装しているrequestDTOを検証しています。SeviceStackではありません。最後に、Http Util string.SendStringToUrを使用してリクエストを送信しました。助けてくれてありがとうございました! –

関連する問題