gpt4 book ai didi

c# - 验证模型属性 WCF Web API

转载 作者:太空狗 更新时间:2023-10-29 20:57:12 25 4
gpt4 key购买 nike

我有一组使用 WCF Web Api 托管的服务,我需要做的是验证应用程序模型中的属性。

例如,在 MVC 3 中,我这样装饰模型中的属性:

    [StringLength(30)]
public string UserName { get; set; }

然后在 Controller 中我继续这样来验证操作系统模型是否满足验证参数:

    [HttpPost]
ActionResult Create(Model myModel)
{
if(ModelState.IsValid(){
Post the model
}
else
{
Don't post the model
}
}

有没有办法在 WCF Web Api 中做类似的事情?

最佳答案

好的,我终于成功地验证了我的模型是否正常工作。我写了一个验证处理程序和几个扩展方法。首先是验证处理程序:

 public class ValidationHandler<T> : HttpOperationHandler
{
private readonly HttpOperationDescription _httpOperationDescription;

public ValidationHandler(HttpOperationDescription httpOperationDescription)
{
_httpOperationDescription = httpOperationDescription;
}

protected override IEnumerable<HttpParameter> OnGetInputParameters()
{
return _httpOperationDescription.InputParameters
.Where(prm => prm.ParameterType == typeof(T));
}

protected override IEnumerable<HttpParameter> OnGetOutputParameters()
{
return _httpOperationDescription.InputParameters
.Where(prm => prm.ParameterType == typeof(T));
}

protected override object[] OnHandle(object[] input)
{
var model = input[0];
var validationResults = new List<ValidationResult>();
var context = new ValidationContext(model, null, null);
Validator.TryValidateObject(model, context, validationResults,true);
if (validationResults.Count == 0)
{
return input;
}
else
{
var response = new HttpResponseMessage()
{
Content = new StringContent("Model Error"),
StatusCode = HttpStatusCode.BadRequest
};
throw new HttpResponseException(response);
}
}
}

注意处理程序如何接收 T 对象,这主要是因为我想验证 API 中的所有模型类型。所以 OnGetInputParameters 指定处理程序需要接收一个 T 类型的对象,而 OnGetOutputParameters 指定处理程序需要返回一个具有相同 T 类型的对象,以防满足验证策略,如果不满足,请查看 on handle 方法如何抛出一个让客户知道存在验证问题的异常。

现在我需要注册处理程序,为此我按照 Pedro Felix 博客的示例写了几个扩展方法 http://pfelix.wordpress.com/2011/09/24/wcf-web-apicustom-parameter-conversion/ (这个博客对我帮助很大,对整个处理程序操作有一些很好的解释)。所以这些是扩展方法:

public static WebApiConfiguration ModelValidationFor<T>(this WebApiConfiguration conf)
{
conf.AddRequestHandlers((coll, ep, desc) =>
{
if (desc.InputParameters.Any(p => p.ParameterType == typeof(T)))
{
coll.Add(new ValidationHandler<T>(desc));
}
});
return conf;
}

所以这个方法检查操作中是否有 T 类型参数,如果有,它将处理程序添加到该特定操作。

这一个调用另一个扩展方法 AddRequestHandler,并且该方法添加新的处理程序而不删除以前注册的处理程序(如果存在)。

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;
}

最后一件事是注册处理程序:

        var config = new WebApiConfiguration();
config.ModelValidationFor<T>(); //Instead of passing a T object pass the object you want to validate
routes.SetDefaultHttpConfiguration(config);

routes.MapServiceRoute<YourResourceObject>("SomeRoute");

就是这样..希望对其他人有帮助!!

关于c# - 验证模型属性 WCF Web API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7974205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com