c# - Web api 操作中的 IHttpActionResult 错误
问题描述
我在 web 服务器中面临方法未找到错误,但在 Visual Studio 本地它可以工作:
[HttpGet]
[Route("api/checkhealth")]
public async Task<IHttpActionResult> CheckHealth()
{
var message = "checkhealth method was invoked";
return new TextResult(message, Request);
}
然后在浏览器中出现以下错误:
<Error>
<Message>An error has occurred.</Message>
<ExceptionMessage>Method not found: 'System.Net.Http.HttpRequestMessage System.Web.Http.ApiController.get_Request()'.
</ExceptionMessage>
<ExceptionType>System.MissingMethodException</ExceptionType>
<StackTrace>at BMI.Controllers.APIController.<CheckHealth>d__0.MoveNext() at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.Start[TStateMachine](TStateMachine& stateMachine) at BMI.Controllers.APIController.CheckHealth() at lambda_method(Closure , Object , Object[] ) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass6_3.<GetExecutor>b__2(Object instance, Object[] methodParameters) at
System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken) --- End of stack trace from previous location where exception was thrown --- at
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Web.Http.Controllers.ApiControllerActionInvoker.
<InvokeActionAsyncCore>d__1.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Web.Http.Controllers.ActionFilterResult.
<ExecuteAsync>d__5.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Web.Http.Dispatcher.HttpControllerDispatcher.
<SendAsync>d__15.MoveNext()
</StackTrace>
</Error>
我已经实现了 IHttpActionResult 如下:
public class TextResult : IHttpActionResult
{
string message;
HttpRequestMessage request;
public TextResult(string message, HttpRequestMessage request)
{
this.message = message;
this.request = request;
}
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
var response = new HttpResponseMessage()
{
Content = new StringContent(message),
RequestMessage = request
};
return Task.FromResult(response);
}
}
我项目中的实际方法是 post,但在这里我尝试先用 get 修复,然后我相信 post 也可以。
这里要提到以下方法完美地工作,所以我认为 IHttpActionResult 缺少一些东西:
[HttpGet]
[Route("api/getok")]
public JsonResult<string> getJson()
{
return Json("OK");
}
你有没有人面临并解决了这个问题。请帮助我,在此先感谢。
解决方案
在请求上使用CreateResponse
扩展名将允许将请求中的任何配置复制到响应中,当您像示例中那样手动创建响应时,可能会丢失这些配置。
public class TextResult : IHttpActionResult {
string message;
HttpRequestMessage request;
public TextResult(string message, HttpRequestMessage request) {
this.message = message;
this.request = request;
}
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken) {
var response = request.CreateResponse(HttpStatusCode.OK, message);
return Task.FromResult(response);
}
}
此外,控制器操作未正确定义,因为它被定义为async Task<IHttpActionResult>
当操作未执行任何异步操作时。
如果实际上不是异步的,则重构以遵循正确的语法。
[HttpGet]
[Route("api/checkhealth")]
public IHttpActionResult CheckHealth() {
var message = "checkhealth method was invoked";
return new TextResult(message, Request);
}
推荐阅读
- google-calendar-api - 如何使用 JSON for Klipfolio 在 Google 日历中提取未来事件?
- javascript - 关于 nodeJs 和渲染模板的快速问题
- module - 使用 Julia PyCall,在 Julia 模块中使用 matplotlib.pyplot
- javascript - Angular 6 router.navigate() queryParams 解析器
- javascript - 组件上的回调函数向 Redux 分派一个操作,但收到警告不要这样做
- javascript - 本地 JS 文件的 Typescript 声明文件
- r - rbind() 在循环中覆盖矩阵行
- javascript - 在 react 中使用 moment.js 从 api 数据中动态检查所有周末
- c# - 如何同时检查两个布尔值Unity,C#
- authentication - 使用自定义凭据提供程序执行 SSO 时不强制执行智能卡移除策略