Ошибка неподдерживаемого типа носителя при использовании json-patch в Ramone

Обновление: я загрузил проект Ramone, добавил его в свой проект, а затем снова запустил приложение с отладчиком. Ошибка показана ниже:

public MediaTypeWriterRegistration GetWriter (Type t, MediaType mediaType) {...

Запись CodecEntry = SelectWriters (t, mediaType) .FirstOrDefault (); => эта строка выдает ошибку

...} Ошибка в CodecManager.cs. Я пытаюсь понять, почему он не распознает тип носителя json-patch. Может быть, потому, что писатель не регистрируется правильно? Я изучаю это. Если вы выясните проблему, дайте мне знать. Поскольку вы являетесь автором библиотеки, вам будет легче разобраться в проблеме. Мне придется просмотреть все файлы кода и методы, чтобы найти проблему. Спасибо!

Мне было приятно узнать, что библиотека Ramone поддерживает операции json-patch, но когда я попробовал, у меня возникла следующая ошибка:

415- Неподдерживаемый тип носителя

Это та же ошибка, что и при использовании RestSharp. Я подумал, что может быть RestSharp не поддерживает json-patch и ошибки, поэтому я решил попробовать Ramone lib, но все равно получаю ту же ошибку. У конечной точки нет проблем, потому что, когда я пробую ту же команду с помощью Postman, она работает, но когда я пытаюсь ее программно на C #, она выдает ошибку неподдерживаемого типа носителя. Вот мой код:

var authenticator = new TokenProvider("gfdsfdsfdsafdsafsadfsdrj5o97jgvegh", "sadfdsafdsafdsfgfdhgfhehrerhgJ");

JsonPatchDocument patch = new JsonPatchDocument<MetaData>();
patch.Add("/Resident2", "Boyle");
//patch.Replace("/Resident", "Boyle");

RSession = RamoneConfiguration.NewSession(new Uri("https://api.box.com"));
RSession.DefaultRequestMediaType = MediaType.ApplicationJson;
RSession.DefaultResponseMediaType = MediaType.ApplicationJson;

Ramone.Request ramonerequest = RSession.Bind("/2.0/files/323433290812/metadata");

ramonerequest.Header("Authorization", "Bearer " + authenticator.GetAccessToken(code).AccessToken);
//var ramoneresponse = ramonerequest.Patch(patch); //results in error: 405 - Method Not Allowed
var ramoneresponse = ramonerequest.Put(patch); //results in error: 415 - Unsupported Media Type

var responsebody = ramoneresponse.Body

Информация о конечной точке доступна здесь: http://developers.box.com/metadata-api

В качестве ссылки я использовал раздел json-patch в следующей статье:

http://elfisk.dk/Ramone/Documentation/Ramone.pdf

Кстати, я попробовал метод Patch () (как показано в статье выше), но это привело к тому, что «Метод не разрешен», поэтому я использовал метод Put (), который, кажется, работает, но затем возникают ошибки из-за операции json-patch.

Мы будем очень благодарны за любую помощь, рекомендации, советы по решению этой проблемы. Заранее большое спасибо.

-Шам


person user3231144    schedule 27.01.2014    source источник


Ответы (1)


В документации Box сказано, что вам следует использовать PUT (что довольно забавно). Сервер даже сообщает вам, что он не поддерживает метод HTTP PATCH (метод 405 запрещен), поэтому PUT должен быть.

Теперь вы говорите Ramone, чтобы он все время использовал JSON (RSession.DefaultRequestMediaType = MediaType.ApplicationJson), так что вы в конечном итоге помещаете документ JSON в Box - там, где вы должны помещать документ JSON-Patch.

Отбросьте оператор «RSession.DefaultRequestMediaType = MediaType.ApplicationJson» и отправьте документ патча как JSON-Patch с использованием: ramonerequest.ContentType («application / json-patch + json»). Put (...).

person Jørn Wildt    schedule 28.01.2014
comment
Привет, Йорн, Спасибо за ответ. Я уже пробовал ramonerequest.contenttype (application / json-patch + json), но это также привело к ошибке (средство записи типа носителя не найдено ...). Позвольте мне попробовать еще раз. Результаты выложу здесь. В очередной раз благодарим за помощь. - person user3231144; 28.01.2014
comment
Йорн, я просто попробовал еще раз, используя ваше предложение, но, как я уже упоминал ранее, я получил ошибку "писатель не найден". Вот полная ошибка: не удалось найти кодек записи для 'application / json-patch + json' + Ramone.MediaTypes.JsonPatch.JsonPatchDocument`1 [WebApplication1._Default + MetaData] ---- Есть другие идеи? Удивительно, что Ramone выдает эту ошибку, потому что, насколько мне известно, Json-patch является поддерживаемым типом носителя. - person user3231144; 28.01.2014
comment
Кажется, что в библиотеке Ramone, которую я добавил через nuget, есть жестко запрограммированные пути. Ramone.Request.ContentType (строка ContentType) строка 37 указывает на файл, который отсутствует в библиотеке. Я просто думаю, что если я загружу исходный код и скомпилирую его локально, это может решить проблему. Скрещенные пальцы! - person user3231144; 28.01.2014
comment
Отредактировал вопрос и добавил описание! См. Обновление в вопросе выше! Спасибо! - person user3231144; 28.01.2014
comment
Обновление: я добился большего прогресса. Я заметил, что Ramone определяет тип носителя как json-patch, а НЕ как json-patch + json. Поэтому, когда я передаю тип контента как json-patch, кажется, что он работает, но затем изменения ошибки на удаленном сервере не распознают тип носителя, и я понимаю, что это происходит потому, что удаленный сервер ожидает, что тип контента будет json-patch + json (который является значением по умолчанию согласно IETF RFC). Итак, я предполагаю, что если я каким-то образом изменю тип содержимого в ramone на json-patch + json, он может начать работать. Снова скрестив пальцы !! - person user3231144; 28.01.2014
comment
Я не знал, что тип носителя изменился! В tools.ietf.org/html/rfc6902 стало application / json-patch + json тогда как более ранняя версия (на которой основан Ramone) использовала application / json-patch. Попробуйте установить RamoneConfiguration.UseStandardCodecs = false и зарегистрируйте кодек JSON-Patch вручную: session.Codecs.AddCodec ‹JsonPatchDocument, JsonPatchDocumentCodec› (новый MediaType (application / json-patch + json)); - person Jørn Wildt; 28.01.2014