相关疑难解决方法(0)

路径上的约束条目'httpMethod'必须具有字符串值

我有一个asp.net Web API项目,在我的WebApiConfig文件中,我定义了以下路由:

config.Routes.MapHttpRoute(
    name: "Web API Get",
    routeTemplate: "api/{controller}",
    defaults: new { action = "Get" },
    constraints: new { httpMethod = new HttpMethodConstraint("GET") }
    );
Run Code Online (Sandbox Code Playgroud)

出于集成测试的目的,我想向a发出请求以HttpSelfHostServer验证我们是否从api调用中收回了正确的数据.我正在做HttpRequestMessage如下:

var httpMethod = new HttpMethod("GET");
var request = new HttpRequestMessage(httpMethod, "http://localhost:XXXX/api/User/");
var results = _client.SendAsync(request).Result;
Run Code Online (Sandbox Code Playgroud)

我希望这会调用UserController上的Get方法,然后返回该方法中定义的结果.但是,我得到以下异常:

System.InvalidOperationException:路由模板'api/{controller}'的路由上的约束条目'httpMethod'必须具有字符串值或者是实现'IHttpRouteConstraint'的类型

http://localhost:XXXX/api/User/当我在浏览器中使用它时,同样的url()可以正常工作,所以我很确定问题必须与我HttpSelfHostServer通过发送请求的方式相同HttpClient.我尝试过使用HttpMethod.Get常量,但这也引发了同样的错误.

有谁知道如何解决这个问题?

c# asp.net httpserver asp.net-web-api asp.net-web-api-routing

6
推荐指数
1
解决办法
6899
查看次数

访问DelegatingHandler中的ApiController类型

我正在使用Asp.Net WebAPI进行项目.我目前正在进行身份验证和授权.

我有一个messageHandler,它将检查请求的HTTP身份验证标头并构建我的身份和用户配置文件.但是,我想用操作可能需要的声明来注释我的控制器操作(或仅控制器)(我们有很多用户可以拥有的声明,因此我不想全部加载它们).

例如:

public class MyController : ApiController
{
    [LoadClaims("SomeClaim", "SomeOtherClaim", "etc")]
    public string Get()
    {
        if (HasClaim("SomeClaim"))
            return "Awesome";

        return "Bummer";
    }
}
Run Code Online (Sandbox Code Playgroud)

在身份验证消息处理程序中,我希望能够查看属性并根据所需内容从数据库中恢复声明.为此,我需要知道我将根据路线命中的控制器和动作:

 protected override Task<HttpResponseMessage> SendAsync(
            HttpRequestMessage request, CancellationToken cancellationToken)
        {
...

            var routeData = request.GetRouteData();
            object controllerName;
            object actionName;
            routeData.Values.TryGetValue("controller", out controllerName);
...
Run Code Online (Sandbox Code Playgroud)

所以我可以做到.但是现在我需要把它变成一个我能反思的Type,但我所拥有的只是控制器名称(甚至不是完整的类名或命名空间).我怎样才能把它变成我可以反思的东西以获得属性等?

我正在研究DefaultHttpControllerSelectorWebAPI堆栈是如何做到的,它似乎正在使用HttpControllerTypeCache.这是一个内部类,所以我无法创建实例.获取目标控制器类型的正确方法是什么?

c# asp.net-web-api asp.net-web-api-routing

5
推荐指数
1
解决办法
3583
查看次数