Как установить пространство имен для DataContract? - PullRequest
0 голосов
/ 10 мая 2019

У меня есть ситуация, когда у меня есть контроллер 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 выше сказано:

"По умолчанию, когда вы применяете 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;
        }

1 Ответ

0 голосов
/ 13 мая 2019

Отвечая на мой собственный вопрос.

Оказалось, что я пропустил одну строку в файле конфигурации, где XmlMediaTypeFormatter был настроен на использование XmlSerializer вместо DataContractSerializer.Это переопределяет пространство имен по умолчанию.

...