【问题标题】:Unable to hit POST in C# WebApi无法在 C# WebApi 中点击 POST
【发布时间】:2016-05-27 17:40:37
【问题描述】:

我一直在使用 stackoverflows,但似乎无法解决我遇到的这个问题。

我正在尝试为我编写的一个小应用程序编写一个错误报告服务,该应用程序访问我的内部 api 并引发异常并将其通过电子邮件发送给我。

正如我的代码一样,我什至无法访问 API 控制器。我的请求返回 500 错误,并且我在控制器上设置的断点永远不会被命中。

这里是 api 控制器(ErrorController.cs):

    [HttpPost]
    // POST: api/Error
    public HttpResponseMessage Post([FromBody]Exception err)
    {
        var result = _service.SendEmail(err);

        return Request.CreateResponse(result, err);
    }

及其在 WebApiConfig.cs 中的配置:

       config.Routes.MapHttpRoute(
            name: "ErrorApi",
            routeTemplate: "api/error",
            defaults: new { controller = "error" }
        );

我试图在服务中调用它,在 catch 块中:

        catch (Exception err)
        {
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri("http://localhost:61857/");
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                var response = client.PostAsJsonAsync("api/error",   err).Result;
            }
            return null;
        }

我有什么明显的遗漏吗?我有点不确定如何正确地将异常作为 JSON 对象发送,然后将其传递到我的电子邮件服务中。我想这可能是我搞砸的地方。

提前感谢您的帮助! :)

【问题讨论】:

  • 你的方法叫做 Post,而不是 Error。你的路线认为它应该是错误的。让你的名字同意,你应该没问题。
  • 我在 webapiconfig 中指定了控制器。我的其他控制器的配置和调用方式相同,我使用这种路由访问它们的 get 方法:“api/{controller}/{id}”。您实际上并没有将方法名称放在 webapi 中的路由中

标签: c# json rest asp.net-web-api


【解决方案1】:

我很确定这个问题在之前发布的这个网站上有一个非常确定的答案,但只是因为我试图帮助我给你我的意见。我认为您应该使用 HttpWebRequest 和 HttpWebResponse 来对您的客户端进行精细控制: 有点像老派:

                string uri = // whatever is your uri (http://url);
                string Method = // whichever is your method ("POST")
                HttpWebRequest req = WebRequest.Create(uri) as HttpWebRequest;
                req.KeepAlive = false;
                req.Method = Method.ToUpper();

                if (("POST,PUT").Split(',').Contains(Method.ToUpper()))
                {
                    content = // here write your content Stream.ReadToEnd() or something similar

                    byte[] buffer = Encoding.ASCII.GetBytes(content);
                    req.ContentLength = buffer.Length;
                    req.ContentType = // write your content type "text/xml";
                    Stream PostData = req.GetRequestStream();
                    PostData.Write(buffer, 0, buffer.Length);
                    PostData.Close();
                }

                HttpWebResponse resp = req.GetResponse() as HttpWebResponse;

                Encoding enc = Encoding.GetEncoding(1252);
                StreamReader loResponseStream =
                new StreamReader(resp.GetResponseStream(), enc);

                string Response = loResponseStream.ReadToEnd();

                loResponseStream.Close();

这样你就可以看到你实际在做什么。然后让您的 wevservice 处理您发送给它的任何内容。

或使用其他经过实际测试的包或程序集。

【讨论】:

  • 感谢您的回复,但这种方式仍然返回 500 错误。还有你好paisano! :D 古巴?
  • 好吧 paisano,500 错误是一个完全不同的问题,因为它大部分时间都与对 Web 服务器中资源的访问权限有关。因此,您的 iis 应该有问题,或者您的应用程序正在中断或导致服务器端出现意外行为。所以尝试发送一个常见的 get 或 post 调用,而不是像 dbugger 所说的错误
猜你喜欢
  • 1970-01-01
  • 2018-09-13
  • 2013-11-16
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-28
  • 1970-01-01
相关资源
最近更新 更多