Web API 2发布404s,但Get工作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Web API 2发布404s,但Get工作相关的知识,希望对你有一定的参考价值。

我很困惑......我有一个非常简单的Web API和控制器,如果我有GET请求,它可以正常工作,但如果我有POST请求则可以使用404。

[RoutePrefix("api/telemetry/trial")]
public class LoginTelemetryController : ApiController
{
    [Route("login")]
    [HttpPost]
    public IHttpActionResult RecordLogin(string appKey) {
        using (var context = new Core.Data.CoreContext()) {
            context.ActivityLogItems.Add(new Domain.Logging.ActivityLogItem()
            {
                ActivityType = "Trial.Login",
                DateUtc = DateTime.UtcNow,
                Key = new Guid(appKey)
            });
            context.SaveChanges();
        }
        return Ok();
    }

当我在邮递员发表反对意见时,我得到:

{
    "message": "No HTTP resource was found that matches the request URI 'http://localhost:47275/api/telemetry/trial/login'.",
    "messageDetail": "No action was found on the controller 'LoginTelemetry' that matches the request."
}

如果我将它更改为[HttpGet]并将appKey作为查询字符串,一切都很好。

我的app启动非常简单:

public void Configuration(IAppBuilder app)
    {
        log4net.Config.XmlConfigurator.Configure();
        HttpConfiguration httpConfig = new HttpConfiguration();
        httpConfig.MapHttpAttributeRoutes(); // <------ HERE

        FilterConfig.RegisterHttpFilters(httpConfig.Filters);
        LoggingConfig.RegisterHandlers(httpConfig.Services);

        ConfigureOAuth(app);
        ConfigureWebApi(httpConfig);
        app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
        app.UseWebApi(httpConfig);
    }

谁能发现为什么没有找到POST请求?谢谢

答案

如果我取出字符串参数并将其替换为请求对象,它可以工作......

而不是:public IHttpActionResult RecordLogin(string appKey)

我创建了一个请求模型类:

public class PostLoginTelemetryRequest{ 
    public string appKey {get;set;}
}

然后改变签名:

public IHttpActionResult RecordLogin(PostLoginTelemetryRequest request)

一切正常(为什么它不能像MVC5 web dev那样采用常规字符串,我不知道,但无论如何......)

(另请注意,我已经使用字符串方法在客户端的每种格式中尝试过这种方法:form-url-encode,raw body等,所以我很确定它不是调用格式问题)。

以上是关于Web API 2发布404s,但Get工作的主要内容,如果未能解决你的问题,请参考以下文章

多个 CORS 适用于 GET 但不适用于 PUT/POST 与飞行前请求 Web api 2

如何使用 Web API Get 方法返回图像

Web Api 跨域基础认证

Web Api使用Get返回DataSet

Web Api 2.0 在邮递员中工作但不在 HTML 页面中

Laravel:Route::resource() GET & POST 工作,但 PUT & DELETE 抛出 MethodNotAllowedHttpException