如何为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">

https://docs.microsoft.com/en-us/dotnet/api/system.runtime.serialization.datacontractattribute?redirectedfrom=MSDN&view=netframework-4.8

在上面的 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。这会覆盖默认命名空间。