Как опубликовать параметр в URL службы Azure, используя WebClient в C#

Я часами тестировал / гуглял, как передать параметр COST в C# в службу Azure, не получив сообщение об ошибке 405.

Следующий код на C++ с использованием Chilkat lib работает нормально

CkHttp http;    
CkHttpRequest req;
http.put_SessionLogFilename("c:/temp/httpLog.txt"); 
req.put_HttpVerb("POST");
req.put_Path("/api/test?value=1234");

CkHttpResponse *resp = http.SynchronousRequest("http://testservice.cloudapp.net",80,false,req);
if (resp == 0 )
    afxDump << http.lastErrorText() << "\r\n";

afxDump << resp->bodyStr() << "\r\n";
delete resp;

Но если он использует этот код C#, я получаю ошибку 405.

string uri = "http://testservice.cloudapp.net/api/test";
string parameter = "value=1234";

using (WebClient wc = new WebClient())
{
    wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
    string HtmlResult = wc.UploadString(uri, parameter);
}

Любые намеки, что я делаю не так?

1 ответ

Решение

Вам будет лучше использовать HttpClient вместо WebClient, Глядя на то, что делает код C++, это должно быть примерно так в C#, используя HttpClient

    public void Test() {
        using (HttpClient client = new HttpClient()) {

        client.BaseAddress = new Uri("http://testservice.cloudapp.net");
        var response = client.PostAsync("api/test?value=1234", new StringContent(string.Empty)).Result;
        var statusCode = response.StatusCode;
        var errorText = response.ReasonPhrase;

        // response.EnsureSuccessStatusCode(); will throw an exception if status code does not indicate success

        var responseContentAsString = response.Content.ReadAsStringAsync().Result;
        var responseContentAsBYtes = response.Content.ReadAsByteArrayAsync().Result;
    }

}

Вот асинхронная версия кода выше

public async Task TestAsync() {
        using (HttpClient client = new HttpClient()) {

            client.BaseAddress = new Uri("http://testservice.cloudapp.net");
            var response = await client.PostAsync("api/test?value=1234", new StringContent(string.Empty));
            var statusCode = response.StatusCode;
            var errorText = response.ReasonPhrase;

            // response.EnsureSuccessStatusCode(); will throw an exception if status code does not indicate success

            var responseContentAsString = await response.Content.ReadAsStringAsync();
            var responseContentAsBYtes = await response.Content.ReadAsByteArrayAsync();
        }

    }
Другие вопросы по тегам