C# 操作处理程序WCF Web Api出现故障?

C# 操作处理程序WCF Web Api出现故障?,c#,wcf,asp.net-mvc-3,wcf-web-api,C#,Wcf,Asp.net Mvc 3,Wcf Web Api,我正在使用WCF web api preview 6构建一个web api,目前我遇到了一个小问题。我希望有一个操作处理程序向操作注入一个IPrincipal,以确定哪个用户发出请求。我已经有了那个操作处理程序,并且已经配置好了。但我注意到,当我用WebInvoke属性修饰操作,同时操作接收到一个IPrincipal和其他域对象时,系统抛出一个异常,告诉我: HttpOperationHandlerFactory无法确定应与服务操作“操作名称”的请求消息内容关联的输入参数。如果操作不需要请求消息

我正在使用WCF web api preview 6构建一个web api,目前我遇到了一个小问题。我希望有一个操作处理程序向操作注入一个IPrincipal,以确定哪个用户发出请求。我已经有了那个操作处理程序,并且已经配置好了。但我注意到,当我用WebInvoke属性修饰操作,同时操作接收到一个IPrincipal和其他域对象时,系统抛出一个异常,告诉我:

HttpOperationHandlerFactory无法确定应与服务操作“操作名称”的请求消息内容关联的输入参数。如果操作不需要请求消息中的内容,请在操作中使用HTTP GET方法。否则,请确保一个输入参数的IsContentParameter属性设置为“True”,或者是可分配给以下类型之一的类型:HttpContent、ObjectContent
1、HttpRequestMessage或HttpRequestMessage
1。

我不知道这里发生了什么。为了给你一些背景知识,我将发布一些代码,让你知道我是如何做事的

行动:

[WebInvoke(UriTemplate = "", Method = "POST")]
    [Authorization(Roles = "")]
    public HttpResponseMessage<dto.Diagnostic> RegisterDiagnostic(dto.Diagnostic diagnostic, IPrincipal principal)
    {
       ......
    }
[WebInvoke(UriTemplate=”“,Method=“POST”)]
[授权(角色=”)]
公共HttpResponseMessage RegisterDiagnostic(dto.Diagnostic诊断,I主要负责人)
{
......
}
WCF web api知道何时注入IPrincipal,因为我用自定义授权属性修饰操作

全局文件中的配置:

var config = new WebApiConfiguration() {EnableTestClient = true};
        config.RegisterOAuthHanlder(); //this is an extension method
        routes.SetDefaultHttpConfiguration(config);

        routes.MapServiceRoute<MeasurementResource>("Measurement");
        routes.MapServiceRoute<DiagnosticResource>("Diagnostic");
var config=new-WebApiConfiguration(){EnableTestClient=true};
config.registeroauthandle()//这是一种扩展方法
routes.SetDefaultHttpConfiguration(配置);
路线。地图服务路线(“测量”);
路线。地图服务路线(“诊断”);
然后,RegisterAuthHandler方法将一个操作处理程序添加到该操作中(如果该操作已使用自定义授权属性修饰)。这就是它的样子:

public static WebApiConfiguration RegisterOAuthHanlder(this WebApiConfiguration conf)
    {
        conf.AddRequestHandlers((coll, ep, desc) =>
        {
            var authorizeAttribute = desc.Attributes.OfType<AuthorizationAttribute>().FirstOrDefault();
            if (authorizeAttribute != null)
            {
                coll.Add(new OAuthOperationHandler(authorizeAttribute));
            }
        });
        return conf;
    }

    public static WebApiConfiguration AddRequestHandlers(
       this WebApiConfiguration conf,
       Action<Collection<HttpOperationHandler>, ServiceEndpoint, HttpOperationDescription> requestHandlerDelegate)
    {
        var old = conf.RequestHandlers;
        conf.RequestHandlers = old == null ? requestHandlerDelegate : (coll, ep, desc) =>
        {
            old(coll, ep, desc);
        };
        return conf;
    }
公共静态WebApiConfiguration注册表Authhanlder(此WebApiConfiguration配置)
{
conf.AddRequestHandlers((coll、ep、desc)=>
{
var authorizeAttribute=desc.Attributes.OfType().FirstOrDefault();
if(authorizeAttribute!=null)
{
coll.Add(新的OAuthoOperationHandler(authorizeAttribute));
}
});
返回形态;
}
公共静态WebApiConfiguration AddRequestHandlers(
此WebApiConfiguration conf,
操作请求者(代理)
{
var old=conf.RequestHandlers;
conf.RequestHandlers=old==null?requestHandlerDelegate:(coll,ep,desc)=>
{
旧的(coll、ep、desc);
};
返回形态;
}

有人能帮我吗?提前谢谢你

尝试将诊断参数包装在ObjectContent中,即
ObjectContent
。然后使用ReadAs()方法拉出对象


应该有用。

很高兴知道!在即将到来的集成MVC堆栈中,这“应该”不是一个问题。