2009-03-18 4 views
2

Я создаю код веб-службы клиентской стороны, используя svcutil. Контракт wsdl, который я использую, содержит потерю мыла. Когда код генерируется, ошибка, похоже, завершается в пространстве имен, которое было определено в контракте.проблема с пространством имен с мылом svcutil

Может ли кто-нибудь объяснить, почему?

Я просто работает SvcUtil [имя файла]

Пример WSDL:

<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://tempuri.org/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://tempuri.org/"> 
<wsdl:types> 
    <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/"> 
     <s:element name="HelloFault"> 
      <s:complexType/> 
     </s:element> 
     <s:element name="HelloWorld"> 
      <s:complexType/> 
     </s:element> 
     <s:element name="HelloWorldResponse"> 
      <s:complexType> 
       <s:sequence> 
        <s:element minOccurs="0" maxOccurs="1" name="HelloWorldResult" type="s:string"/> 
       </s:sequence> 
      </s:complexType> 
     </s:element> 
    </s:schema> 
</wsdl:types> 
<wsdl:message name="HelloWorldSoapIn"> 
    <wsdl:part name="parameters" element="tns:HelloWorld"/> 
</wsdl:message> 
<wsdl:message name="HelloWorldSoapOut"> 
    <wsdl:part name="parameters" element="tns:HelloWorldResponse"/> 
</wsdl:message> 
<wsdl:message name="NewMessage"> 
    <wsdl:part name="detail" element="tns:HelloFault"/> 
</wsdl:message> 
<wsdl:portType name="Service1Soap"> 
    <wsdl:operation name="HelloWorld"> 
     <wsdl:input message="tns:HelloWorldSoapIn"/> 
     <wsdl:output message="tns:HelloWorldSoapOut"/> 
     <wsdl:fault name="FaultName" message="tns:NewMessage"/> 
    </wsdl:operation> 
</wsdl:portType> 
<wsdl:binding name="Service1Soap12" type="tns:Service1Soap"> 
    <soap12:binding transport="http://schemas.xmlsoap.org/soap/http"/> 
    <wsdl:operation name="HelloWorld"> 
     <soap12:operation soapAction="http://tempuri.org/HelloWorld" soapActionRequired="" style="document"/> 
     <wsdl:input> 
      <soap12:body use="literal"/> 
     </wsdl:input> 
     <wsdl:output> 
      <soap12:body use="literal"/> 
     </wsdl:output> 
     <wsdl:fault name="FaultName"> 
      <soap12:fault name="FaultName" use="literal"/> 
     </wsdl:fault> 
    </wsdl:operation> 
</wsdl:binding> 

Формирует:

namespace tempuri.org 
{ 

using System.Runtime.Serialization; 



[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")] 
[System.Runtime.Serialization.DataContractAttribute(Name="HelloFault", Namespace="http://tempuri.org/")] 
public partial class HelloFault : object, System.Runtime.Serialization.IExtensibleDataObject 
{ 

    private System.Runtime.Serialization.ExtensionDataObject extensionDataField; 

    public System.Runtime.Serialization.ExtensionDataObject ExtensionData 
    { 
     get 
     { 
      return this.extensionDataField; 
     } 
     set 
     { 
      this.extensionDataField = value; 
     } 
    } 
} 

}

Но другие типы де заключенные в контракте, объявляются без пространства имен?

[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] 
[System.ServiceModel.MessageContractAttribute(IsWrapped=false)] 
public partial class HelloWorldRequest 
{ 
... 

ответ

0

Я не уверен, что я понимаю, в чем проблема ... вы можете уточнить?

Из внешнего вида, казалось бы, WCF делает правильную вещь ... сгенерированный класс имеет правильный URI пространства имен в атрибуте [DataContract] в соответствии со схемой в фрагменте WSDL, который вы показали.

Что вы ожидали?

Обновление: ОК, я вижу, что вы говорите, но в этом конкретном случае это тоже не неожиданно. Если вы внимательно присмотритесь, обратите внимание, что другой класс, который вы упомянули (HelloWorldRequest), является Договором о передаче сообщений, а не DataContract. Контракты с сообщением не имеют самих пространств имен, хотя они могут указывать пространство имен для элемента оболочки вокруг тела сообщения (см. Свойство WrapperNamespace).

В вашем случае контракт сообщения указывает, что он не завернут, поэтому WrapperNamespace не будет применяться в любом случае.

Обновление № 2: Что касается пространства имен CLR (а не URI пространства имен XML), SvcUtil дает вам возможность контролировать это; проверьте аргумент/namespace: аргумент в documentation.

+0

Извините, моя точка зрения не принадлежала ни одному из других типов в пространстве имен, в котором они были объявлены. Только ошибка с мылом. Я отредактирую сообщение. Спасибо – 2009-03-18 22:31:34

+0

Теперь я понимаю, что я не был ясен, я имел в виду пространство имен C#, а не пространство имен, определенное в DataContract. – 2009-03-19 06:59:52

+0

Большое спасибо, я знал об переключателе пространства имен. (Мне не помогло, изложив мой вопрос плохо!) Знаете ли вы, почему поведение по умолчанию заключается в том, чтобы поместить ошибки в пространство имен CLR, а не в сообщения? Кажется странным? в частности, когда вы получаете ошибки в таких пространствах имен, как «http: // www.домен/имя/2009/03/18 'и т. д. – 2009-03-19 15:17:28

1

Вы должны использовать /UseSerializerForFaults атрибут на SvcUtil, это приведет к тому, XmlSerializer будет использоваться для чтения и записи ошибок (но только те), а не по умолчанию DataContractSerializer (который будет по-прежнему использоваться для отдыха из материала).

Это, кажется, подлинная ошибка - больше информации о моем blog post.

+0

Что делать, если/UseSerializerForFaults сигнализируется как не распознанная опция? – Juri

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