我已经遍布堆栈溢出,无法解决我遇到的这个问题。
我正在尝试为我编写的一个小应用程序编写一个错误报告服务,该应用程序会抛出我的内部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对象,然后将其传递到我的电子邮件服务。我认为这可能是我搞砸的地方。
提前感谢您的帮助! :)
答案 0 :(得分:0)
我很确定在此网站上发布的这个问题有一个非常确定的答案,但仅仅因为我想帮助我给你我的意见。我认为您应该使用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处理您发送给它的任何内容。
或使用经过实际测试的其他包装或组件。