Выполнение PATCH в веб-API с использованием WebClient (. Net 4.0) - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть приложение WinForms. Net 4.0, которое использует WebClient (поскольку, к сожалению, я не смог заставить его работать ни с HttpWebRequest, ни с HttpClient, из-за того, что оно находится в Net 4.0, а не в *. Net 4.5).

Использует веб-API. Он выполняет GET для API:

using System.Net;
using Newtonsoft.Json;

using (WebClient client = new WebClient())
{
    ServicePointManager.SecurityProtocol = (SecurityProtocolType)(3072);
    client.Headers.Add("someHeader", 123);
    string res = client.DownloadString("http://someurl.com/api/someendpoint");
    List<SomeObject> someObjects = JsonConvert.DeserializeObject<List<SomeObject>>(res);
}

Он также выполняет DELETE:

using System.Net;

using (WebClient client = new WebClient())
{
    ServicePointManager.SecurityProtocol = (SecurityProtocolType)(3072);
    client.Headers.Add("someHeader", 123);
    client.UploadValues("http://someurl.com/api/someendpoint", "DELETE", new NameValueCollection());
}

Теперь мне нужно выполнить PATCH, но я совершенно не понимаю, как это сделать Это. Я искал inte rnet, и в большинстве примеров используется HttpClient или HttpWebRequest. Я не нашел ничего, что использует WebClient. Поэтому мне нужно отправить JSON примерно так:

{
    "op": "replace",
    "path": "filename",
    "value": "somefile.pdf"
}

в виде запроса глагола PATCH к API. Я пробовал это:

using System.Net;
using Newtonsoft.Json;

string json = @"[{
                    ""op"": ""replace"",
                    ""path"": ""//filename"",
                    ""value"": ""somefile.pdf""
                }]";

var serializeModel = JsonConvert.SerializeObject(json);

using (WebClient client = new WebClient())
{
    ServicePointManager.SecurityProtocol = (SecurityProtocolType)(3072);
    client.Headers.Add("someHeader", 123);
    var response = client.UploadString("http://someurl.com/api/someendpoint/123", "PATCH", serializeModel);
}

Но я получаю это исключение:

Удаленный сервер возвратил ошибку: (415) Неподдерживаемый тип носителя.

(И эта конечная точка Patch API работает хорошо, поскольку в настоящее время она используется веб-приложением Angular)

Любая помощь будет принята с благодарностью. Спасибо.

1 Ответ

0 голосов
/ 11 февраля 2020

Вы должны установить Content-type в заголовках, точно так же.

client.Headers.Add("Content-Type", "application/json");

Это обеспечит тип носителя, чтобы конечная точка знала, какой тип носителя она получает. Если вы все еще получаете ошибку, ваша конечная точка может не принять json.

...