如何使用 RestSharp 将对象(作为 XML)发布到我的 ApiController?

2023-12-12

我有一个实现 REST API 的 ASP.NET MVC4 网站,我从客户端应用程序使用该网站。我的 ApiController 方法接受并返回 XML 形式的复杂对象。

我最近发现了 RestSharp,并开始将我的客户项目转移到该项目上。但是,我确实遇到了问题。看来almost工作——它是如此接近,我几乎可以尝到成功的滋味——但我就是无法让它100%工作。

我通过电线传递的对象看起来像这样:

// The object I'm passing across the wire
public class Example
{
    bool IsActive { get; set; }
    string Name { get; set; }
}

我的 ApiController 方法如下所示:

// My ApiController method
public HttpResponseMessage PostExample(Example example)
{
    if (ModelState.IsValid)
    {
        db.Examples.Add(example);

        db.SaveChanges();

        HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, example);

        return response;
    }
    else
    {
        return Request.CreateResponse(HttpStatusCode.BadRequest);
    }
}

当我尝试将对象发布到我的网站时,会出现问题,如下所示:

var example = new Example () { IsActive = true, Name = "foo" };

var request = new RestSharp.RestRequest("/api/example", RestSharp.Method.POST);

request.AddBody(example, XmlNamespace);

var client = new RestClient();

client.BaseUrl = "foo.com";

var response = client.Execute<Example>(request);

上面的代码确实命中了我的 ApiController 中的 PostExample 方法,并且它有一个 Example 对象作为参数。HoweverExample 对象的属性值与我传递给 Execute 方法的属性值不同!在一种情况下,IsActive 成员为 false 而不是 true,尽管我也看到过一种情况,其中 Name 成员本应具有值,但为 null。

我使用 Fiddler 做了一些调查,看来正确的值are在 RestSharp 生成的 XML 中创建。但是,XML 与 Web 服务器在执行 GET 时发出的格式并不完全相同。这些差异很微妙,但似乎决定了它是否有效。 Web 服务器端的框架似乎对这些格式差异很敏感,并因此错误地解释了 XML。

这是我从 RestSharp 获得的 XML:

<Example xmlns="http://schemas.datacontract.org/2004/07/ExampleNamespace">
  <Name>foo</Name>
  <IsActive>true</IsActive>
</Example>

这是我在网络服务器上执行 GET 时得到的结果(或者使用 DataContractSerializer 进行序列化时得到的结果,这就是我之前所做的):

<Example xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/ExampleNamespace">
  <IsActive>true</IsActive>
  <Name>foo</Name>
</TagDto>

RestSharp 版本与 DataContractSerializer 版本有以下差异:

  1. 字段的顺序不同
  2. RestSharp 不包含额外的命名空间 XMLSchema-instance 命名空间
  3. DataContractSerializer 不包含任何空格或换行符(我在上面添加了这些空格或换行符以提高可读性)

我很惊讶其中任何一个都会产生很大的影响,但显然它们确实如此。另请注意,在我在 AddBody 调用中添加显式命名空间之前,生成的 XML 中缺少该命名空间(显然),并且传递到我的 ApiController 中的示例对象是null.

不管怎样,我注意到 RestSharp 允许您覆盖序列化器,并提供了一种使用 .NET XML 序列化器的方法。我尝试使用它(无济于事)。

这是我在调用 AddBody 之前添加的内容:

request.XmlSerializer = new RestSharp.Serializers.DotNetXmlSerializer(XmlNamespace);

..这就是我得到的结果:

<?xml version="1.0" encoding="utf-8"?>
<Example>
  <Name>foo</Name>
  <IsActive>true</IsActive>
</Example>

这显然没有什么好处,尤其是因为它以 XML 声明开头,我想这是would造成问题。没有办法关闭它,因为 RestSharp 派生类没有提供这样做的方法。另外,没有命名空间 - 无论我如何尝试在 RestSharp 中设置命名空间(在 DotNetXmlSerializer 的构造函数中,通过设置命名空间成员,或通过将命名空间传递给添加主体)。在我看来,这门课只不过是一个陷阱。

看起来我唯一的选择是创建自己的序列化器类并在内部使用 DataContractSerializer。是这样吗,还是我错过了什么?

(顺便说一句,我可以将请求的 RequestFormat 设置为 JSON,它就可以工作 - 但我仍然想知道如何使用 XML 来实现它)。


我遇到了一些 AddBody 调用无法正确序列化 JSON 值的问题,因此可能与您的问题有一些相似之处。除了 AddBody,您可以尝试:

request.AddParameter("text/xml", xmlAsString, ParameterType.RequestBody);

如果可行,您可以查看将第二个参数更改为 xml 对象,并查看序列化程序是否执行您想要的操作。

另一种选择可能是XmlMediaTypeFormatter.ReadFromStreamAsync没有正确选择合适的序列化器;你可以尝试覆盖该函数。

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

如何使用 RestSharp 将对象(作为 XML)发布到我的 ApiController? 的相关文章

  • C++网络序列化[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一种将 C 数据包序列化为网络流的解决方案 我在这里看到很多帖子提到人们 ACE 谷歌协议缓
  • 如何保存 JPanel 上图形的当前状态[重复]

    这个问题在这里已经有答案了 我有一个程序 允许用户使用 Graphics 将矩形和圆形添加到 JPanel 我想要做的是将当前 JPanel 的当前状态 即所有形状及其位置 保存到文件中 并能够加载该文件并恢复该状态 我有一个 Shapes
  • Java反序列化中避免重复对象

    我有两个列表 list1 和 list2 其中包含对某些对象的引用 其中某些列表条目可能指向同一对象 然后 由于各种原因 我将这些列表序列化为两个单独的文件 最后 当我反序列化列表时 我想确保我不会重新创建超出需要的对象 换句话说 List
  • 如何从 JSON 获取字符串对象而不是 Unicode

    我在用着Python 2从中解析 JSONASCII 编码文本文件 当使用以下任一方式加载这些文件时json https docs python org 2 library json html or simplejson https pyp
  • 如何序列化 android.graphics.Path 对象

    我正在尝试将 Android graphics Path 对象存储在内部设备内存中 有谁知道如何序列化 android graphics Path 对象 另外 还有其他方法来存储 Path 对象吗 谢谢 我这样做的方法是从原始 Path 类
  • 使用 apicontroller 与 odata EntitySetController [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我刚刚开始学习 ASP NET Web API 有几件事我仍然不清楚 为什么我应该使用EntitySetController 它继承自odata
  • GetAsync 请求返回空内容

    我想知道为什么当我在邮递员中尝试它有数据返回时它返回 null 这是我的代码 public async Task
  • MemoryStream 的 byte[] 缓冲区可以具有可变大小吗?

    我正在将一个对象序列化为byte using MemoryStream byte serialized new byte 1000 using MemoryStream stream new MemoryStream serialized
  • WCF 和 n 层架构以及序列化性能

    当使用 WCF 服务作为接口层使用 5 层架构 前端 gt 接口层 gt 业务层 gt 数据库层 gt 数据库 时 让客户端应用程序调用它的方法 我是否也应该使用 WCF 服务业务层和数据库层 我问是因为 3 个服务之间进行的所有序列化 反
  • Web API 异常记录器

    我正在使用 IExceptionLogger 和 ExceptionHandler 为我的 Web api 服务进行全局日志记录和错误处理 现在有什么方法可以从 ExceptionLoggerContext 上下文中读取 POST 数据 只
  • .NET NewtonSoft JSON反序列化映射到不同的属性名称

    我有以下从外部接收的 JSON 字符串 team v1 attributes eighty min score home or away home score 22 team id 500 v1 attributes eighty min
  • 应用程序内的 SQLite 文件版本兼容性

    我有一个 C NET 应用程序 一种复杂的计算应用程序 其中用户输入数据 处理后的信息使用 JSON 序列化和 EF 保存到 SQLite 文件中 需要时可以将其加载到我们的应用程序中 应用程序在开发过程中经历了很多变化 类也被修改 因此
  • AutoMapper.Mapper 不包含 CreateMap 的定义

    这可能是一个基本问题 但想知道我没有得到 AutoMapper Mapper CreateMap 方法 我使用了错误的 AutoMapper 参考 包吗 谢谢 静态版本CreateMap方法在 4 2 中已弃用 然后在版本 5 0 中从 A
  • 但说真的...... ASP.NET WebAPI 实现示例(包括 OAuth)

    我真的对 WCF 示例不感兴趣 我发现的 DotNetOpenAuth 实现也是不完整的 https github com DavidChristiansen DotNetOpenAuth WebAPI 40 or 假设WCF https
  • 委托给子组件的模式

    在我正在工作的产品中 非常基本的场景之一是类的序列化 通常 要序列化的类会在其子组件上调用序列化 例如如果有一个类 s t 班级 A B C D 那么A Pack会调用pack B C D 上的函数 由于有很多这样的类 因此必须一遍又一遍地
  • 无法使用 Json.NET 8.0.1 反序列化具有字节数组属性的对象

    升级代码库以使用 Json NET 8 0 1 后 一些反序列化出现问题 使用 Json NET 7 0 1 一切正常 显然这是类型属性的反序列化byte 这会导致问题 如果我删除byte 属性它工作正常 我可以使用这个简单的控制台应用程序
  • 在 Dapper 中处理 Oracle 数据库连接

    我正在尝试连接到 Oracle 数据库并尝试执行查询 下面是我的模型类 using System using System Collections Generic using System Linq using System Web usi
  • 扩展 Protobuf 消息

    我有许多不同的模式 但是每个模式都包含一组字段 我想知道是否有一种方法可以让不同的模式扩展父模式并继承其字段 例如 这就是我想要的 message Parent required string common1 0 optional stri
  • 自定义WebApi授权数据库调用

    我正在尝试确定我编写的自定义授权属性是否确实是一个好主意 Scenario假设我们有一系列商店 每个商店Store有一个主人 只有商店的所有者才能对商店进行CRUD操作 除了具有Claim这基本上超越了所有权要求 并表示他们可以在任何商店上
  • 为什么 JTables 使 TableModel 在呈现时不可序列化?

    所以最近我正在开发一个工具 供我们配置某些应用程序 它不需要是什么真正令人敬畏的东西 只是一个具有一些 SQL 脚本生成功能并创建几个 XML 文件的基本工具 在此期间 我使用自己的 AbstractTableModel 实现创建了一系列

随机推荐

  • Boost.python自动转换参数

    我正在使用 boost python 来包装 C 类 A 该类采用字符串作为构造函数 然后我有一个函数 fun A arg 它将引用 A 作为参数 我想要一个 fun 的Python包装器 如果我传递一个对Python字符串的引用的变量 这
  • Prototype 或 JQuery 能否在 AJAX 请求上返回 HTTP 状态代码

    url http example com new Ajax Request url onComplete function transport alert transport status 如果网站正在运行 我希望返回 200 的状态 如果
  • 带有附加数据的 Swift 3 错误

    在 Swift 3 中 在错误 异常中放置 可能很多 附加信息的推荐方法是什么 捕获器可以使用它来解决 处理问题 在我见过的所有例子中 他们都使用enums 与相关的值 这对于大量信息来说似乎过于麻烦 冗长 具体来说 我正在编写一个简单的解
  • 粘贴对象时强制仅粘贴值的 Excel VBA 代码会导致奇怪的行为

    我有一个电子表格 用户可以在其中输入调查数据 并且像许多其他电子表格一样 需要防止用户覆盖各种格式功能 我使用了以下内容 Private Sub Workbook SheetSelectionChange ByVal Sh As Objec
  • 使用流和 sum 方法对 BigDecimal 列表求和

    如果列表中有所有 int 或 long 或其他原始数据类型值 那么我们使用以下方法获得所有值的 sun return items stream mapToInt i gt i sum 我有 BigDecimal 值列表 如何使用查找所有值的
  • 如何使用 Perl 6 运行外部程序? (例如 Perl 5 中的“系统”)

    我可以用system在 Perl 5 中运行外部程序 我喜欢想system就像 Perl 中的微型 Linux 命令行 但是 我找不到相关文档system在 Perl 6 中 等效的是什么 Perl6 实际上有两个命令替换system从 P
  • 纯 CSS 旋转动画在无限循环中损坏

    自从我在这里问问题以来已经有一段时间了 所以如果我做错了什么请原谅 我有一个问题CSS动画 我希望我的动画不断重复但不失去最初的效果 然而 我的代码或 CSS 动画行为似乎存在错误 首先完成后2 个旋转动画 旋转 旋转 定义的 循环开始 但
  • 查询优化:选择相交点的多边形

    我有两个 Oracle 18c 表 ply 多边形 4970 行 pnt 点数 3500 行 形状存储在 SDO GEOMETRY 列中 编辑 我现在意识到大多数点都是重复的 空间上 但我认为这不是问题 数据可以在这里查看 数据库小提琴 我
  • 在 Postgresql 的 where 子句中使用 Alias 列

    我有一个这样的查询 SELECT jobs CASE WHEN lead informations state IS NOT NULL THEN lead informations state ELSE NEW END AS lead st
  • Three.js Raycaster在浏览页面时发生偏移

    如果场景没有显示在整个页面上并且您可以滚动 Raycast 将停止工作并被您滚动的内容所抵消 向一侧滚动 20 像素 在对象下方 20 像素处单击 以便 Raycaster 正确识别该对象 如何解决这个问题 非常感谢您的帮助 使用 var
  • 如何计算句子中的单词数,忽略数字、标点符号和空格?

    我该如何计算句子中的单词数 我正在使用Python 例如 我可能有以下字符串 string I am having a very nice 23 day 那将是7个字 我在处理每个单词前后的随机空格数以及涉及数字或符号时遇到问题 str s
  • R 消息:错误 - 替换有 x 行,数据有 y

    我正在尝试使用该包ggmap使用地址列表计算目标地址的距离 我的 csv 数据如下所示 Order ID Address 1652049 435 E 70TH ST 10021 1652123 1365 YORK AVE 10021 165
  • Sonar Lint 与服务器规则不同步

    Sonar Lint 2 0 它已连接到我自己的 Sonar Qube 服务器 插件没有报告任何问题 问题是它与我的服务器规则不同步 找到了 Java 文档中提到的那些 但它们似乎也不是全部 我想知道这些java规则列表是否仅在未连接到任何
  • 将十六进制编码的字符串转换为字符串

    我想转换以下十六进制编码String在斯威夫特 3 中 dcb04a9e103a5cd8b53763051cef09bc66abe029fdebae5e1d417e2ffc2a07a4 至其等价物String J 7c f A 以下网站可以
  • R Shiny radioButtons 如何更改某些选项的颜色?

    ui lt fluidPage radioButtons dist Distribution type c Normal norm Uniform unif Log normal lnorm Exponential exp server l
  • Bootstrap 3 简单的下拉菜单不起作用

    当尝试调整到Bootstrap 3时 我遇到了以下问题 当我单击名为的按钮时F 我想Home and Not Home出现 但目前还没有 This是我正在学习的视频 div class navbar navbar inverse navba
  • 包装类的代码生成器

    您知道有一种工具可以根据另一个类生成包装类吗 编辑 通过包装类 我的意思是包装所有公开的 公共 受保护 属性方法事件的类 以便您可以将任何逻辑放在中间 我的具体目的是用它来验证包装类的行为 您可以使用 T4 模板并编写自己的逻辑 http
  • 无法连接到在 VSTS 中运行的 Docker 容器

    我有一个测试 启动 Docker 容器 执行验证 与 Docker 容器中的 Apache httpd 通信 然后停止 Docker 容器 当我在本地运行此测试时 此测试运行得很好 但当它运行时托管VSTS 因此托管构建代理 无法连接到Do
  • 如何使用 ggplot2 和刻度格式化带有指数的轴标签?

    使用新版本的 ggplot2 和刻度 我无法弄清楚如何以科学计数法获取轴标签 例如 x lt 1 4 y lt c 0 0 0001 0 0002 0 0003 dd lt data frame x y ggplot dd aes x y
  • 如何使用 RestSharp 将对象(作为 XML)发布到我的 ApiController?

    我有一个实现 REST API 的 ASP NET MVC4 网站 我从客户端应用程序使用该网站 我的 ApiController 方法接受并返回 XML 形式的复杂对象 我最近发现了 RestSharp 并开始将我的客户项目转移到该项目上