【问题标题】:Getting "Method Not Allowed" error when using ASP.NET Web API inside ASP.NET Web Forms在 ASP.NET Web 窗体中使用 ASP.NET Web API 时出现“方法不允许”错误
【发布时间】:2016-01-08 10:57:20
【问题描述】:

我正在尝试使用此处给出的代码实现 HMAC 身份验证:http://bitoftech.net/2014/12/15/secure-asp-net-web-api-using-api-key-authentication-hmac-authentication/

我将此代码集成到我的 ASP.NET Web 表单应用程序中。我创建了一个名为“HMACAPI”的文件夹,并在其中添加了控制器和过滤器。我还安装了所有必需的 Nuget 包。这就是我实现服务方法的方式:

[HMACAuthentication]
[RoutePrefix("api/forms")]
public class FormsController : ApiController
{
    [Route("")]
    public IHttpActionResult Get()
    {
        ClaimsPrincipal principal = Request.GetRequestContext().Principal as ClaimsPrincipal;

        var Name = ClaimsPrincipal.Current.Identity.Name;

        return Ok("test");
    }

    [Route("")]
    public IHttpActionResult Post(string order)
    {
        return Ok(order);
    }
}

这是我的 API 路由配置:

GlobalConfiguration.Configure(APIWebFormsProject.API.WebApiConfig.Register);

但是当我使用client.PostAsJsonAsync() 时,它显示Method Not Allowed 错误。我尝试了各种 SO 问题,但他们的答案都没有帮助。

我尝试了什么:

  1. 删除了WebDAV 模块。

  2. 为 post 方法添加了[HttpPost] 属性。

我正在使用“http://localhost:56697/api/forms/”URL 来访问 API。但我也试过“http://localhost:56697/api/forms”和“http://localhost:56697/api/forms/test”。

更新

按照 Obsidian Phoenix 的建议,我可以在没有 [HMACAuthentication] 属性的情况下运行它。但我想通过 HMAC 身份验证来实现这一点。那么,这可能是什么原因呢?

【问题讨论】:

  • 你需要使用GlobalConfiguration.Configuration.Routes.MapHttpRoute而不是RouteTable.Routes.MapHttpRoute
  • @MethodMan 我试过了。还是行不通。抱歉,我打错了。这是Method Not Allowed 错误。
  • 检查一下,你有没有'config.MapHttpAttributeRoutes();'作为路线配置的一部分。这里的“配置”是 WebApiConfig 中的“HttpConfiguration”
  • @singsuyash 是的,我已经这样做了。
  • 您能否添加示例代码,详细说明您对 API 的客户端调用?

标签: c# asp.net .net asp.net-web-api webforms


【解决方案1】:

我猜你的问题是将 HTTP POST 发送到端点(api/forms)并且与 HMACAuth 属性无关,对吧?

如果是这种情况,那么不要将 Order 作为字符串发送,它应该是一个包含字符串属性的 POCO 对象,如下所示:

public class OrderModel
{
    public string Order { get; set; }
}

【讨论】:

  • 我试过这个,也试过你的原始代码。但在这两种情况下,我都会收到“任务已取消”错误。
  • 我刚刚发现它在没有 HMAC 属性的情况下工作。但我想在我的应用程序中使用 HMAC。我能做什么?
【解决方案2】:

您的方法缺少[FromBody] 属性。

为了使用client.PostAsJsonAsync(url, "test"),您的方法签名应如下所示:

[Route("")]
public IHttpActionResult Post([FromBody] string order)
{
    return Ok(order);
}

同样,传递一个 POCO 对象:

[Route("")]
public IHttpActionResult Post([FromBody] OrderModel order)
{
    return Ok(order);
}

【讨论】:

  • 我试过了,但它仍然给A task was cancelled.
  • 去掉hmac属性还能用吗?
  • 实际上它在没有 HMAC 属性的情况下工作。但是我想使用HMAC认证。
  • 当然。我只是想缩小问题的范围。我稍后再看看
  • 谢谢。我会等待你的回答并标记它是否解决了问题。 :)
【解决方案3】:

最后,我解决了这个问题。我没想到这会是一个解决方案。

更改了端口使用了本地 IIS 服务器,而不是 Visual Studio 开发服务器。虽然我在问这个问题之前使用的是 IIS,但我认为端口更改解决了这个问题。

嗯,感谢大家为解决我的问题所做的努力。由于您的所有答案和 cmets,我能够得出这个解决方案。 :)

【讨论】:

    猜你喜欢
    • 2018-02-04
    • 2017-11-03
    • 2018-05-27
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    • 2013-12-25
    相关资源
    最近更新 更多