验证模型属性 WCF Web APi

2024-02-02

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

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

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

然后在控制器中,我像这样继续验证操作系统模型是否满足验证参数:

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

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

现在我需要注册处理程序,为此我编写了几个扩展方法,遵循 Pedro Felix 博客的示例http://pfelix.wordpress.com/2011/09/24/wcf-web-apicustom-parameter-conversion/ 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");

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

验证模型属性 WCF Web APi 的相关文章

  • 在 C/C++ 中获得正模数的最快方法

    通常在我的内部循环中 我需要以 环绕 方式索引数组 因此 例如 如果数组大小为 100 并且我的代码要求元素 2 则应该给它元素 98 高级语言 例如 Python 可以简单地使用my array index array size 但由于某
  • 有没有快速创建集合的方法?

    目前我正在创建一个像这样的新集 std set a s s insert a1 s insert a2 s insert a3 s insert a10 有没有办法创建s在一行 int myints 10 20 30 40 50 std s
  • 如何保证对象只有一个线程

    我有以下代码 class Service public void start creates thread which creates window and goes to message loop void stop sends WM C
  • 何时使用 =default 使析构函数默认?

    尽管对构造函数使用 default 对我来说很清楚 即强制编译器在其他构造函数存在时创建默认构造函数 但我仍然无法理解这两种类型的析构函数之间的区别 那些使用 default 的 那些没有显式定义并由编译器自动生成的 我唯一想到的是 gro
  • 为什么在创建矩阵类时使用向量不好?

    对于我的矩阵类 我做了 template
  • 平滑滚动.net 表单

    您好 我正在 net 中使用表单 并且在运行时动态添加大量链接标签 我将这些链接标签添加到面板并将该面板添加到 winform 当链接标签的数量增加时 表单会显示一个自动滚动条 垂直 现在 当我使用自动滚动向下滚动时 表单在滚动时不会更新其
  • 类特定的新删除运算符是否必须声明为静态

    标准中是否要求类特定的 new new delete 和 delete 是静态的 我可以让它们成为非静态成员运算符吗 为什么需要它们是静态的 它们被隐式声明为静态 即使您没有键入 static
  • fprintf() 线程安全吗?

    我正在为野人就餐问题的某些变量编写一个 C 解决方案 现在 我创建线程 每个线程都将 FILE 获取到同一个调试文件 在线程内我正在使用 fprintf 进行一些打印 打印的语句不受任何类型的互斥锁等保护 我没有在调试文件中观察到任何交错行
  • ASP.NET 中获取当前域的最佳方法是什么?

    我想知道在 ASP NET 中获取当前域的最佳方法是什么 例如 http www domainname com subdir http www domainname com subdir 应该产生http www domainname co
  • 单例模式和 std::unique_ptr

    std unique ptr唯一地控制它指向的对象 因此不使用引用计数 单例确保利用引用计数只能创建一个对象 那么会std unique ptr与单例执行相同 单例确保只有一个实例属于一种类型 A unique ptr确保只有一个智能指针到
  • Asp.Net Mvc 无法注销

    这是我的登录代码 var expire DateTime Now AddDays 7 Create a new ticket used for authentication var ticket new FormsAuthenticatio
  • 给出 5 个参数,但在终端中只得到 3 个参数

    我想将一个文件传递给一个c 程序 如果我在 IDE 中执行此操作 test string string lt test txt return argc 5 但在终端上我刚刚得到argc 3 看来 这是因为 什么是 lt 意思是 我正在使用
  • 无法在内存位置找到异常源:cudaError_enum

    我正在尝试确定 Microsoft C 异常的来源 test fft exe 中 0x770ab9bc 处的第一次机会异常 Microsoft C 异常 内存位置 0x016cf234 处的 cudaError enum 我的构建环境是 I
  • 运行选定的代码生成器时出错:“未将对象引用设置到对象的实例。”错误?

    我已经尝试了所有解决方案 例如修复 VS 2013 但没有用 当您通过右键单击控制器文件夹来创建控制器并添加控制器时 然后右键单击新创建的控制器的操作并选择添加视图 当我尝试创建视图时 就会发生这种情况 它不是一个新项目 而是一个现有项目
  • 将标量添加到特征矩阵(向量)

    我刚刚开始使用 Eigen 库 无法理解如何向所有矩阵成员添加标量值 假设我有一个矩阵 Eigen Matrix3Xf mtx Eigen Matrix3Xf Ones 3 4 mtx mtx 1 main cxx 104 13 error
  • 如何分析组合的 python 和 c 代码

    我有一个由多个 python 脚本组成的应用程序 其中一些脚本正在调用 C 代码 该应用程序现在的运行速度比以前慢得多 因此我想对其进行分析以查看问题所在 是否有工具 软件包或只是一种分析此类应用程序的方法 有一个工具可以将 python
  • 在 EnvDTE 中调试时捕获 VS 局部变量

    是否可以使用 EnvDTE 进行 vsix Visual Studio 扩展来捕获本地和调试窗口使用的调试数据 或者可以通过其他方法吗 我想创建一个自定义的本地窗口 我们可以修改它以根据需要显示一些较重的内容 而无需为高级用户牺牲原始的本地
  • IEnumerable.Except 不起作用,那么我该怎么办?

    我有一个 linq to sql 数据库 非常简单 我们有 3 个表 项目和用户 有一个名为 User Projects 的连接表将它们连接在一起 我已经有了一个获得的工作方法IEnumberable
  • MVC4 捆绑:由于 css3 功能而缩小失败?

    我想使用 MVC4 捆绑和缩小 但我总是在未缩小的 css 文件中收到此错误消息作为注释 Minification failed Returning unminified contents 534 29 run time error CSS
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte

随机推荐

  • 具有任何主体和标头的 Webmock 存根请求

    如何使用 Webmock 来存根带有任何正文和标头的请求 我尝试使用正则表达式 WebMock stub request post api quickblox com with body gt headers gt to return st
  • AudioKit:如何对AKPlayer进行调频

    我正在尝试对来自 AKPlayer 的信号执行频率调制 从而播放 mp3 文件 我尝试使用 AKOperationEffect 但它没有按预期工作 let modulatedPlayer AKOperationEffect player p
  • 暂时使用另一个功能分支的提交

    我的 git 流程如下所示 x x feature branch a master x x develop x x feature branch b 目前有一个提交和 PRbranch a to develop 我先等一下branch aP
  • 钥匙串无法正确导入 p12 并且系统钥匙串看起来很混乱

    I have p12 file of ios Development certificate I want to import it into my login keychain But when I double tap it goes
  • R ggplot2拼凑公共轴标签

    根据下面的代码和数据 是否可以拥有通用的图例标签而无需删除xlab and ylab来自ggplot代码使用patchwork 我之所以问这个问题是因为我有很多ggplots所以我觉得删除它并不理想xlab and ylab从每个ggplo
  • 如何在我的应用程序中显示网页?

    我需要从服务器端发送简单网页 带有图像 mht 或压缩网页文件夹 并在没有浏览器控制的情况下将其显示在我的 Android 应用程序的 UI 上 有人可以建议我如何在 Android 设备上继续执行此操作 要在应用程序中显示网页 有两种方法
  • 通过 POST 抓取 Bandcamp 粉丝收藏

    我一直在尝试抓取 Bandcamp 粉丝页面以获取他们购买的专辑列表 但我在有效地做到这一点时遇到了困难 我用 Selenium 写了一些东西 但它有点慢 所以我想学习一个解决方案 可以向网站发送 POST 请求并从那里解析 JSON 这是
  • 在 R 中打印 h2o 模型的“漂亮”表格

    有多个包用于R这有助于从统计模型输出中打印 漂亮 表格 LaTeX HTML TEXT 并轻松比较替代模型规范的结果 其中一些包是apsrtable xtable memisc texreg outreg and stargazer 示例请
  • 装饰器将函数状态从方法更改为函数

    更新 回答下面的内联问题 我有一个检查程序 一个目标是装饰器中的逻辑知道它正在装饰的函数是类方法还是常规函数 这以一种奇怪的方式失败了 以下是在 Python 2 6 中运行的代码 def decorate f print decorato
  • 使用 MapKit 将视图居中到用户位置的按钮

    MapKit 中是否有一个专用按钮可以将相机置于用户位置的中心 或者我是否必须手动创建按钮和切换mapView showsUserLocation true 这种方式运行良好 Swift 并且可以自定义按钮 class YourViewCo
  • Git 切换分支

    git 有一些东西我还没有搞懂 是分支 假设我有一个本地存储库A我从远程克隆的B 所以现在A检查主分支 所以当我从A它去B master B只是 github 上的一个克隆 C 为了保持同步 我时不时地从其他地方拉取C主分支 But now
  • 向 pentaho design studio 添加 jdbc 驱动程序并配置数据源

    我刚刚将 pentaho 的设计工作室集成到 BI 服务器中 有谁知道如何添加 mysql jdbc 驱动程序 我需要连接才能定义关系操作流程 在我的研究中我发现 http wiki bizcubed com au xwiki bin vi
  • js-bson 错误 - OpenShift 上的 Mosca(MQTT 代理)

    我一直在 OpenShift 上使用 NodeJS 进行一些工作 当我尝试在 Node 实例中运行 Mosca 服务器时遇到问题 我收到的错误如下 Error var lib openshift 5547bd284382ec394a0000
  • 获取Oracle子查询中order by后的第一行

    我有一个表学生 id 姓名 部门 年龄 分数 我想找到每个部门得分最高 在最年轻的学生中 的最年轻的学生 在 SQL Server 中 我可以使用以下 SQL select from student s1 where s1 id in se
  • 我应该避免 typedef,尝试使用原始名称并尽可能进行强制转换吗?

    我不确定这里的词汇 但希望我能让人理解 当我使用不太扎实的 C 知识来研究 winapi 时 我发现了很多 typedef 的东西 对我来说 这些东西似乎使问题变得过于复杂 并添加了我必须记住的另一件事 例如 UINT代替unsigned
  • 在python中创建用户定义类的对象集

    table set class GlobeLearningTable object def init self mac port dpid self mac mac self port port self dpid dpid def add
  • Android:动态创建控件和方向变化

    目前我正在开发一个动态创建控件的 Android 应用程序 每次用户单击按钮时 按钮下方都会出现一个新的 EditText 并且用户可以与 EditText 进行交互 但是 如果屏幕方向发生变化 用户创建的 EditText 也会消失 用户
  • 来自plotly的三元图

    在此输入图像描述 https i stack imgur com lyUJu png 我想在三元图中添加线条 水平 垂直 以突出显示某些部分 可以帮我吗 三元图 代码如下 fig px scatter ternary df a df a b
  • 根据 big-o 表示法进行评级的算法是否会受到并行性的影响?

    我刚刚读了一篇关于矩阵乘法突破的文章 O n 2 373 的算法 但我猜矩阵乘法是可以并行化的 那么 如果我们开始生产千核处理器 这会变得无关紧要吗 事情会发生怎样的变化 并行执行不会改变特定算法的复杂性的基本原理 充其量 您只是花费一些给
  • 验证模型属性 WCF Web APi

    我有一组使用 WCF Web Api 托管的服务 我需要做的是验证应用程序模型内的属性 例如 在 MVC 3 中 我像这样装饰模型中的属性 StringLength 30 public string UserName get set 然后在