在 RESTful WCF 中混合 XML 和 JSON,无需单独的方法

2024-05-07

我有一个 RESTful WCF 服务,可以返回 XML、JSON 或 JSONP,具体取决于参数,例如/service.svc/stuff?format=xml or service.svc/stuff?format=json&callback=myCallback。为此,我创建了一个自定义Behavior、MethodEncoder 和 MethodEncoderFactory,它们处理包装 JSONP 回调并根据格式参数选择编写器。在我的编码器中WriteMessage()方法,我做类似的事情

XmlWriter writer = IsXmlRequested() ? XmlDictionaryWriter.CreateTextWriter(stream) :
  JsonReaderWriterFactory.CreateJsonWriter(stream)
message.WriteMessage(writer);

然后,我定义我的服务方法,就好像它们只返回 JSON,但使用我的自定义绑定元素:

[OperationContract, JSONPBehavior, WebGet(ResponseFormat = WebMessageFormat.Json,
  UriTemplate = "stuff")
public List<Thing> GetStuff(){...}

它几乎可以工作。当我请求 XML 或 JSON 时,我得到了格式正确的内容,但 XML 并未按我的预期进行序列化。 XML 如下所示:

<root type="array">
 <item type="object">
  <FirstPropertyOnAThing>1</FirstPropertyOnAThing>

然而,如果我将 WebMessageFormat 设置为 XML,我会得到如下结果:

<ArrayOfThings xmlns="...>
 <Thing ...>
  <FirstPropertyOnAThing>1</FirstPropertyOnAThing>

我绝对想要后者。我猜这是因为在创建 Message 对象时结果被序列化到字典中;我的自定义编码器只是决定如何将该字典写入响应流。所以它得到了正确的编码,但不完全是格式,这已经由 ResponseFormat 决定了。

首先,这是对的吗?如果是这样,我该如何解决这个问题?例如,我可以编写自己的WebMessageFormat吗?或者我是否只需要屈服并为 /json/* 和 /xml/* 编写具有不同 ResponseFormat 属性的单独方法(和 URI 模板)?

Update:在.net 4中,有一个WebOperationContext.Current.OutgoingResponse.Format您可以设置的属性。我想我的问题归结为:有没有办法在 .net 3.5 中实现这一点?


是的,有一种方法可以在 .NET 3.5 中实现您想要的功能,而无需编写单独的方法。

这篇博文 http://blogs.msdn.com/dotnetinterop/archive/2008/11/04/rest-in-wcf-varying-response-content-type-based-on-http-request-headers.aspx处理您描述的情况:根据传入请求改变响应的内容类型。但是,这篇文章描述了一种略有不同的解决方案。

特别是,请求者不在请求 URL 中指定所需的内容类型,而是在Accept请求的标头。

该解决方案涉及使用自定义WebHttp行为 http://msdn.microsoft.com/en-us/library/system.servicemodel.description.webhttpbehavior.aspx检查 Accept 标头并适当格式化响应。在我看来,这是一个非常优雅的解决方案。您无需在业务逻辑中执行任何操作即可获得自适应格式。只需附加行为即可起作用。


另请查看WCF REST Contrib 库 http://wcfrestcontrib.codeplex.com/在 CodePlex 上。

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

在 RESTful WCF 中混合 XML 和 JSON,无需单独的方法 的相关文章

  • 如何自定义 ASP.Net Core 模型绑定错误?

    我只想从我的 Web API Asp net Core 2 1 返回标准化的错误响应 但我似乎不知道如何处理模型绑定错误 该项目刚刚从 ASP NET Core Web 应用程序 gt API 模板创建 我有一个简单的操作定义为 Route
  • ASP.NET 数据集 getdataBy 无法启用约束。一行或多行包含违反非空、唯一或外键约束的值

    你好 我有一个非常简单的网络表单 我在此表单上有一个按钮和一个网格视图 以及一个包含链接表 bill docket docket bill 等的数据集 在按钮上单击我使用以下代码 protected void button click ob
  • 我可以将特定警告视为错误吗?

    以下是我有时在学生代码中看到的模式的简化版本 bool foobar int a int b if a lt b return true 当然 真正的代码要复杂得多 Visual Studio 报告警告 C4715 并非所有控制路径都会返回
  • 使用 CMake 对 SDL 的未定义引用

    我正在使用 SDL v1 2 15 7 和 CMake 3 2 1 开发一个项目 在 h 文件中我添加了 include
  • C++ Linux GCC 应用程序中的 GUID

    我有很多服务器运行这个 Linux 应用程序 我希望他们能够生成一个碰撞概率较低的 GUID 我确信我可以从 dev urandom 中提取 128 个字节 这可能没问题 但是有没有一种简单易用的方法来生成与 Win32 更等效的 GUID
  • 是否可以获取指向装箱非托管值类型的指针?

    是否可以获取指向装箱非托管值类型的指针 而无需编写对每个支持的类型进行强制转换的大型 switch 语句 就像是 object val Contains a boxed unmanaged value such as int long by
  • memccpy 返回比 src 起始地址更低的内存地址

    我有一个学校项目 我必须重新编码memccpy 功能 我使用 2 个程序来检查我的代码是否正常工作 第一个是只有一个主程序的小程序 第二个程序是另一个学生开发的 可以找到here https github com yyang42 mouli
  • 为什么Windsor只能拦截虚方法或接口方法?

    我正在阅读文档 发现如果不使用接口 那么 Windsor 只能拦截虚拟方法 这是 Windsor 的限制还是 C 语言的限制 我正在寻找深入的答案 C 语言在这里完全无关 问题是拦截在运行时级别如何工作 一种技术是从类继承 实现接口并将其用
  • 为什么我在这段代码中不断得到两个相同的随机值? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么我的随机数生成器在 C 中不是随机的 https stackoverflow com questions 932520 why does it appear that my random num
  • 二维数组的列求和

    我有一个IEnumerable
  • 本地主机和 request.Url.Authority

    我的应用程序通过 URL 中的公司标识符分隔用户 company1 app com company2 app com 我正在本地 PC 上进行测试 请求如下 company1 localhost com 但是 我的 request Url
  • 在 OpenGL 中使用不同的着色器程序?

    我必须在 OpenGL 中针对不同的对象使用两个不同的着色器程序 我发现我必须使用glUseProgram 在不同的着色器程序之间切换 但对此没有太多信息 鉴于我有两个用于不同对象的不同着色器程序 如何为每个着色器程序生成和绑定 VAO 和
  • Ajax 函数在重定向后不保存滚动位置

    正如标题所述 我编写了一个 ajax 函数 该函数应该滚动到用户在重定向之前所在的位置 我写了一个alert对于测试场景 它确实触发了 但滚动不断回到顶部 我在这里做错了什么 JavaScript ajax type GET url Adm
  • 如何将对 System.Data.DataSetExtensions 的引用添加到网站 ascx.cs 文件?

    我们正在处理一个网站项目并尝试参考System Data DataSetExtensions 使用 Web 应用程序会更好 不过 技术主管有她的理由 这是我们尝试过的 找到装配路径 打开 Visual Studio 命令提示符并运行sn e
  • 如何在Phone类库项目中添加ResourceDictionary并访问它

    我正在开发一个项目 其中我有一个引用图书馆项目的子项目 在我的库项目 电话类库 中 如何创建 ResourceDictionary xaml 其中我需要添加一些样式并在 xaml 文件和 cs 文件中使用它 我需要访问 xaml 文件中的
  • 如何明智地解释这个编译器警告?

    当我执行这段代码时question https stackoverflow com a 51056490 2411320 我收到这个警告 warning format d expects argument of type int but a
  • 使用 Node.js 访问用 C++ 编写的 SDK

    我有一个用 C 语言编写的 SDK 可以与我的扫描仪设备进行通信 我需要开发一个可以访问扫描仪设备的电子应用程序 我知道有很多库可用于扫描仪 但我想使用这个 SDK 因为它允许我访问设备的完整功能 而且它是由设备制造商提供的 那么 有没有什
  • 来自资源中 ImageSource 的 System.Drawing.Image

    我的问题与这个非常相似 wpf图像资源以及运行时在wpf控件中更改图像 https stackoverflow com questions 940592 wpf image resources and changing image in w
  • C# 中的快速字符串解析

    在 C 中解析字符串最快的方法是什么 目前我只是使用字符串索引 string index 并且代码运行合理 但我忍不住认为索引访问器所做的连续范围检查必须添加一些东西 所以 我想知道我应该考虑哪些技术来增强它 这些是我最初的想法 问题 使用
  • 使用 Crypto++ 和 .NET 的 CFB 模式下的 TripleDES

    我正在尝试使用 TripleDES 使用 C 应用程序获得相同的结果 该应用程序具有Crypto https www cryptopp com 和 NET应用程序使用三重DESCryptoServiceProvider https msdn

随机推荐

  • Rails 5:ActionMailer 的“deliver_later”从未在生产环境中交付

    我有一个非常基本的邮件程序设置 如下所示来发送交易邮件程序 class PayoutMailer lt ApplicationMailer default from email protected cdn cgi l email prote
  • Swift 3 异步调度警告

    我有这个代码 DispatchQueue global priority DispatchQueue GlobalQueuePriority default async let url URL string itemImageURL let
  • 在 SSIS 流中使用临时表失败

    我有一个 ETL 过程 可将约 40 个表从源数据库 Oracle 10g 提取到 SQL Server 2014 开发人员版 临时环境 我的提取过程 确定暂存中的最新行 从源中选择所有较新的行 将结果插入 TEMPTABLE 将 TEMP
  • 由于空数组包含电子邮件为空的文档,MongoDB 错误 E11000 重复键错误集合

    这是我正在编写的代码 const createOrgPerso new Person org newOrganisation doc id data 但空数组仍在创建中 然后再次运行这段代码 它给出E 11000 duplicate key
  • 打印 HTML 时删除默认浏览器页眉和页脚

    我得到了一个带有以下内容的 HTML 我想问的问题是 有什么方法可以删除网络浏览器添加到打印页面的字符串吗 Such as 打印页面的网站 页数 网页标题 印刷日期 这些通常是浏览器特定的打印设置 例如 在 IE 和 FireFox 中 您
  • Sweetalert 2 异步文本区域

    我尝试使用这个简单的文档示例https sweetalert2 github io https sweetalert2 github io 但我收到错误消息 未捕获的语法错误 await 仅在异步函数中有效 document ready f
  • Hibernate save() 和事务回滚

    在休眠状态下 当我save 事务中的一个对象 然后我回滚它 保存的对象仍然保留在数据库中 这很奇怪 因为这个问题不会发生在update or delete 方法 只需用save 这是我正在使用的代码 DbEntity dbEntity ge
  • 按升序选择最后 20 个顺序 - PHP/MySQL

    这是我的表结构 MyTable ID P K auto increment TopicID UID Comment 现在我想获取某个 TopicID 的最后 20 条评论 但它应该按升序排序 就像 Facebook 默认只显示最后 20 条
  • Angular刷新页面重复url中的页面

    我是一名 Angular 新手 正在构建一个简单的寻呼机 我设置了路由器 以便空 URL 重定向到仪表板组件 因此localhost 4200会自动路由到localhost 4200 dashboard完美的 但是 如果我单击刷新按钮 它会
  • mysql 更新或插入多条记录(如果表中尚不存在)

    mysql 数据库中有一个名为 inventory item 的表 id product id 和 quantity 是表的列 id 是主键 在插入记录时自动生成 当用户提交要向表中插入多条记录的表单时 可以在 foreach 循环中收集所
  • C4533 警告:为什么 goto 会跳过变量初始化?

    我越来越 警告 C4533 goto FreeDC 跳过了 b 的初始化 但是如果代码到达标签FreeDC in WM CREATE b 未初始化 如果在这种情况下未初始化 如何跳过其初始化 我只是不明白这个警告 include
  • iOS 6 模拟器卡在启动画面上

    我正在使用 Mac os 10 8 2 和 Xcode 4 5 2 当我尝试在 ios 5 5 1 模拟器中运行我的应用程序时 它工作正常 但是当我尝试在 ios 6 模拟器中运行应用程序时 它会卡在空白屏幕上 谁能让我知道我的问题的解决方
  • Gradle 构建错误:aidl.exe 以非零退出值 1 完成

    这是我的 build gradle 文件 点击查看截图 https i stack imgur com ENTbh png 和我的错误 错误 任务 app compileDebugAidl 执行失败 com android ide comm
  • 为 schtasks.exe 指定日期参数的独立于语言的方法

    我正在尝试将新任务添加到 Windows 任务计划程序schtasks exe 我现在遇到的问题是指定任务应该在一周中的哪一天运行 据我所知 愚蠢的程序坚持将该参数作为日期名称的字符串缩写 本地化为操作系统语言 其他参数可以很好地接受英语字
  • 普通的 x86 或 AMD PC 是直接从 ROM 运行启动/BIOS 代码,还是先将其复制到 RAM? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我知道现代计算机已经修改了哈佛架构 它们可以从保存数据的地方以外的地方读取指令 这一事实是否允许它们直接从 ROM 芯片获取指令 他们是先
  • 使用 Proguard 混淆 ActionBarSherlock

    我正在尝试使用混淆我的 Android 应用程序proguard and ant eclipse proguard从来不工作 总是失败error 1 但我越来越class file unexpectedly contains class 到
  • 高性能 C# 服务器套接字的提示/技术

    我有一个 NET 2 0 服务器似乎遇到了扩展问题 可能是由于套接字处理代码的设计不佳 我正在寻找有关如何重新设计它以提高性能的指导 使用场景 50 150 个客户端 每个客户端以高速率 高达 100 秒 秒 发送小消息 每条 10 字节
  • PostgreSQL函数中如何返回查询结果行?

    我按照教程尝试了很多次 但都失败了 有人可以给我一些例子吗 这是我的代码 它提示 ERROR invalid type name SETOF RECORD create or replace function find returns SE
  • Java-&& 评估

    任何人都可以帮助我解决以下问题 我有这样的代码 if cond1 cond2 cond10 这里 cond1 是昂贵的操作 其输出是布尔值 现在我的问题是 当 cond2 输出为 false 时 JAVAC 会做什么 具体来说 它是评估 c
  • 在 RESTful WCF 中混合 XML 和 JSON,无需单独的方法

    我有一个 RESTful WCF 服务 可以返回 XML JSON 或 JSONP 具体取决于参数 例如 service svc stuff format xml or service svc stuff format json callb