2016-12-01 2 views
0

Я пытаюсь выполнить патч с JsonServiceClient в стек API службы следующим образом: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("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; } 
} 

Услуги:

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(); 
    } 

Я использую Marvin.JsonPatch V 1.0.0 библиотеки.

+0

Это не ошибка в ServiceStack, пожалуйста, обновите сообщение, чтобы включить реализацию ServiceStack Service. – mythz

ответ

1

По-прежнему неясно, откуда исходит Исключение, поскольку это не ошибка в ServiceStack. Если вы зарегистрировали пользовательский формат или фильтр, который выдает эту ошибку, включите его impl (или ссылку на него), а также полный StackTrace, который идентифицирует источник ошибки.

Но вы никогда не должны звонить Patch<object> как тип возврата object, не указывающий тип ответа для десериализации. Поскольку у вас есть IReturn<T> маркер, вы можете просто отправить запрос DTO:

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

который будет пытаться преобразовали ответ в IReturn<PartialTestRequestResponse> Response DTO. Но, как ваш запрос DTO реализует IRequiresRequestStream он говорит, что вы ожидали неизвестных байт, что не соответствует нормальному Запроса DTO, в этом случае вы, вероятно, хотите использовать необработанный HTTP Client как HTTP Utils, например:

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

Вы можете изменить ContentType клиента JSON, используя запрос фильтр, например:

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

Но это более целесообразно использовать HTTP-клиент низкого уровня, как HTTP Utils для не JSON Service запросов, как это.

+0

Вы правы, это настраиваемый фильтр запросов, который бросает ошибку, не SeviceStack –

+1

Этот фильтр проверяет для requestDTO, который реализует интерфейс IJsonPatchDocumentRequest, не является SeviceStack. Наконец, я использовал строку Http Util.SendStringToUr для отправки запроса. Большое спасибо за вашу помощь! –

Смежные вопросы