2013-07-09 3 views
4

Небольшая проблема. Когда я запускаю приложение ServiceStack API на моей машине Windows, пространства имен отображаются правильно, как я их укажу. Но когда я запускаю службу на компьютере Linux с mod_mono. Затем эти пространства имен переопределяются чем-то другим. Пожалуйста, смотрите мой код ниже:Изменение пространства имен ServiceStack не работает

DTO

namespace API_ESERVICES_NOTIFICATION 
{ 
[DataContract(Namespace = "urn:com.example:service:20130308")] 
public class GetAccountNotification 
{ 
    [DataMember] 
    public GetAccountResponseTO getAccountResponse { 
     get; 
     set; 
    } 
} 
} 

Окна сгенерированных SOAP11 XML

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
     <GetAccountNotification xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:com.example:service:20130308"> 
      <getAccountResponse xmlns:d2p1="urn:com.example:service:entity:20130308"> 

Linux Mod_Mono

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
     <GetAccountNotification xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/API_ESERVICES_NOTIFICATION"> 
      <getAccountResponse xmlns:d2p1="http://schemas.datacontract.org/2004/07/API_ESERVICES_NOTIFICATION.Model"> 

Теперь как я получаю Linux пространство имен будет урна: com.example: service: entity: 20130308 и urn: com.example: service: 20130308, а не http://schemas.datacontract.org/2004/07/API_ESERVICES_NOTIFICATION.Model. Любая помощь будет оценена.

ответ

3

Это похоже на ошибку в Mono, не занимающую пространство имен DataContract или не учитывающее urn: префикс допустимого пространства имен xml. Я рекомендую filing a bug in Mono.

Альтернативы вы можете попробовать покидают пространство имен пустым и указать атрибут сборки в вашем проект Assembly.cs вместо этого, например:

[assembly: ContractNamespace("urn:com.example:service:20130308", 
    ClrNamespace = "API_ESERVICES_NOTIFICATION")] 
+0

Я попробовал это, к сожалению это не работает, я представлю ошибку, но к сожалению, мы никогда не получим новую моно-версию в Linux. Поддержка поддерживается только до 2.10.8, которая уже стоит за текущей версией. Поддерживает ли serviceStack System.xml.serialization? как альтернатива? –

+0

http://mono-project.com/DistroPackages/Ubuntu –

+2

Нет, ServiceStack не имеет собственного XML-сериализатора, он просто использует DataContractSerializer под капотом. Вы можете поменять его, зарегистрировав свой собственный в 'IAppHost.ContentTypeFilters', но вам нужно найти тот, который хорошо работает в Mono. – mythz

Смежные вопросы