簡體   English   中英

如何為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/zh-cn/dotnet/api/system.runtime.serialization.datacontractattribute?redirectedfrom=MSDN&view=netframework-4.8

在上面的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;
        }

回答我自己的問題。

原來,我在配置文件中錯過了XmlMediaTypeFormatter設置為使用XmlSerializer而不是DataContractSerializer的一行。 這將覆蓋默認名稱空間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM