Отправка сериализованных данных в запросах на получение / отправку - PullRequest
0 голосов
/ 11 мая 2018

Привет У меня есть метод в моем веб-сервисе следующим образом

[HttpGet]
public HttpResponseMessage RegenerateReport(/*string reportObject*/)
    {
       var result = new HttpResponseMessage(HttpStatusCode.OK);
        result.Content = new StringContent("Operation completed.");
        return result;
    }

Работает нормально, но я действительно хочу иметь возможность отправлять сериализованный объект JSON в эту функцию.

В качестве альтернативы , я попытался использовать тег [HttpPost] для этой функции и вызывать из своего кода следующим образом

var data = Encoding.ASCII.GetBytes(JsonConvert.SerializeObject(obj));

        string _BaseUrl = ConfigurationManager.AppSettings["WebAPIBaseURL"];

        HttpWebRequest request = WebRequest.Create(string.Format("{0}{1}",
                                        _BaseUrl,
                                        "test/RegenerateReport?FileName=" + RCFileName)) as HttpWebRequest;

        // Set type to POST
        request.Method = "Post";
        request.ContentType = "application/xml";
        request.ContentLength = data.Length;

        using (var stream = request.GetRequestStream())
        {
            stream.Write(data, 0, data.Length);
        }


        var response = (HttpWebResponse)request.GetResponse();

         var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();

Возвращает

Запрошенный ресурс не поддерживает http-метод 'GET'.

Обновление Эта ошибка теперь удалена, так как я добавил оба тега [HttpGet] и [HttpPost] в мой веб-метод. Теперь дело в том, как передать сериализованный объект в метод веб-сервиса. Спасибо!

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Как сообщает @MacakM, хотя HttpClient, кажется, является окончательным решением, я делюсь точным кодом, который работал для меня.

HttpClient _client = new HttpClient();
        var apiParams = new Dictionary<string, string>();
        apiParams.Add("FileName", RCFileName ?? string.Empty);
        string _BaseUrl = ConfigurationManager.AppSettings["WebAPIBaseURL"];
        _client.BaseAddress = new Uri(_BaseUrl);
        _client.DefaultRequestHeaders.Accept.Clear();
        _client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        var response = _client.GetAsync(string.Format("{0}{1}",
                                        _BaseUrl,
                                        "test/RegenerateReport?FileName=" + RCFileName)
                                      );
        if (response.IsCompleted)
            _client.Dispose();//Dispose the client object
0 голосов
/ 11 мая 2018

Если вы хотите отправить некоторые данные в веб-сервис, вы всегда должны использовать [HttpPost].

Я думаю, что ваш потребитель не прав и не выполняет запрос POST.Я обычно использую пакет Microsoft.AspNet.WebApi.Client, и пример кода может выглядеть следующим образом:

    static async Task TestApiAsync()
    {
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("http://localhost:33854/");
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            var result = await client.PostAsync("api/School", "hello", new JsonMediaTypeFormatter());

            result.EnsureSuccessStatusCode();

            // if it something returns
            string resultString = await result.Content.ReadAsAsync<string>();
            Console.WriteLine(resultString);
        }
    }

Просто замените параметры для вашей потребности (URL, тип, тело)

...