如何为DataContract设置命名空间?
How to set Namespace for DataContract?
我有一个情况,我有一个由用户调用的 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 文档中说:
"By default, when you apply the DataContractAttribute to a class, it uses the class name as the local name and the class's namespace (prefixed with "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;
}
回答我自己的问题。
原来我在配置文件中遗漏了一行,其中 XmlMediaTypeFormatter 被设置为使用 XmlSerializer 而不是 DataContractSerializer。这会覆盖默认命名空间。
我有一个情况,我有一个由用户调用的 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 文档中说:
"By default, when you apply the DataContractAttribute to a class, it uses the class name as the local name and the class's namespace (prefixed with "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;
}
回答我自己的问题。
原来我在配置文件中遗漏了一行,其中 XmlMediaTypeFormatter 被设置为使用 XmlSerializer 而不是 DataContractSerializer。这会覆盖默认命名空间。