【发布时间】:2019-05-10 14:14:04
【问题描述】:
我有一种情况,我有一个由用户调用的 REST 控制器,然后该控制器从上游请求数据并接收 JSON 作为响应。然后将此 JSON 转换为 XML 并作为响应发送回用户。 问题是我无法为 XML 根元素设置特定的命名空间。我正在使用 DataContractSerializer。
我对 .NET 并没有真正的经验,之前主要使用 JSON 工作,所以我对接下来要尝试什么有点迷茫。
我尝试使用 ContractNamespaceAttribute 设置命名空间,例如:
[assembly: ContractNamespaceAttribute("http://schemas.datacontract.org/2004/07/APIBridge.Models", ClrNamespace = "APIBridge.Models")]
namespace APIBridge.Models
{
[DataContract]
public class Order
{
// DataMembers here...
}
}
我还尝试在 DataContracAttribute 中设置命名空间,例如:
namespace APIBridge.Models
{
[DataContract(Name = "Order", Namespace =
"http://schemas.datacontract.org/2004/07/APIBridge.Models")]
public class Order
{
// Datamembers here...
}
}
我希望如何设置命名空间:
<ArrayOfOrder xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/APIBridge.Models">
但实际结果是:
<ArrayOfOrder xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
在上面的 DataContractAttribute 文档中说:
“默认情况下,当你将 DataContractAttribute 应用到一个类时,它使用类名作为本地名,使用类的命名空间(前缀为“http://schemas.datacontract.org/2004/07/”)作为命名空间 URI。”
这实际上是想要的结果,但作为默认命名空间,我得到的结果与上面提到的相同。这是为什么呢?
有什么想法吗?
更新:以下请求的服务操作
public List<Order> loadOrdersBasic(UserOptions userOpts)
{
List<Order> orders = new List<Order>();
HttpClient httpClient = AuthenticationHelper.CreateHttpClient(userOpts, options);
String url = String.Format("api/orders?supplier_no={0}", userOpts.SupplierId);
HttpResponseMessage response = httpClient.GetAsync(url).Result;
if (response.IsSuccessStatusCode)
{
orders = response.Content.ReadAsAsync<List<Order>>().Result;
}
else {
throw new ServiceException(getHttpErrorMessage(url, response));
}
return orders;
}
【问题讨论】:
-
可以发一下服务操作吗?
标签: c# .net xml datacontractserializer