【问题标题】:Sending serialized data in Get/Post Requests在 Get/Post 请求中发送序列化数据
【发布时间】:2018-10-21 12:34:53
【问题描述】:

您好,我的网络服务中有一个方法如下

[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] 添加到我的 web 方法中,因此现在已删除此错误。现在的问题是如何将序列化对象传递给 Web 服务方法。谢谢!

【问题讨论】:

  • 你用的是web api还是什么技术?
  • webapi 服务 .net 4.6

标签: c# asp.net web-services asp.net-web-api httpwebrequest


【解决方案1】:

如果你想在 web 服务中提交一些数据,你应该总是使用 [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、类型、正文)

【讨论】:

    【解决方案2】:

    正如@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
    

    【讨论】:

    • 补充一点:在提交数据时使用 PostAsync 确实是一种很好的做法。此外,当您使用 Async 方法时,您应该使用 await 关键字。当然,它也可以这样工作:)
    • 好的,我会改进它。谢谢 ! :)
    猜你喜欢
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多