2016-12-21 23 views
1

入力XMLから発行WCF XMLシリアル化ソープ要求

<ws:processAcord xmlns:ws="http://ws.plus.predictivelogic.com/"> 
    <arg0>CrlUser</arg0> 
    <arg1>CrlPass</arg1> 
    <arg2>Life Scope</arg2> 
    <arg3 /> 
    </ws:processAcord> 

オブジェクトクラス

[XmlRoot(ElementName = "processAcord", Namespace = "http://ws.plus.predictivelogic.com/")] 
    public class Input 
    { 
     //[DataMember] 
     [XmlElement(ElementName = "arg0")] 
     public string Arg0 { get; set; } 
     //[DataMember] 
     [XmlElement(ElementName = "arg1")] 
     public string Arg1 { get; set; } 
     //[DataMember] 
     [XmlElement(ElementName = "arg2")] 
     public string Arg2 { get; set; } 
     //[DataMember] 
     [XmlElement(ElementName = "arg3")] 
     public string Arg3 { get; set; } 
     //[DataMember] 
     [XmlAttribute(AttributeName = "ws", Namespace = "http://www.w3.org/2000/xmlns/")] 
     public string Ws { get; set; } 
    } 

サービス定義

public UnderWritingOutput Get(Input inputXml) 
{ 
//do stuff 
} 

シリアライゼーションに問題が発生します。私はそれがデバッグしているとき私はサービス内のデータを取得していないよ。

[DataContract]やその他のxml属性のように、自分のコードに何らかの属性宣言の問題がなければなりません。

アップデート1:

私はすでにサービスの詳細を投稿し、ここで結合..

<system.serviceModel> 
<services> 
    <service name="ServiceApplication.UnderWritingService" behaviorConfiguration="debug"> 
    <endpoint address="GetUnderWriting" binding="basicHttpBinding" contract="ServiceApplication.IUnderWritingService"></endpoint> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://localhost:60418/"/> 
     </baseAddresses> 
    </host> 
    </service> 
</services> 
<behaviors> 

    <serviceBehaviors> 
    <behavior name="debug"> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> 
    </behavior> 
    <behavior> 
     <!-- To avoid disclosing metadata information, set the values below to false before deployment --> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> 
     <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
     <serviceDebug includeExceptionDetailInFaults="false"/> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<protocolMapping> 
    <add binding="basicHttpsBinding" scheme="https" /> 
</protocolMapping> 
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 

私はそれを見せてあるsoapUI要求を開いています私の入力XMLとして

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:ser="http://schemas.datacontract.org/2004/07/ServiceApplication"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <tem:Get> 
     <!--Optional:--> 
     <tem:inputXml> 
      <!--Optional:--> 
      <ser:Arg0>?</ser:Arg0> 
      <!--Optional:--> 
      <ser:Arg1>?</ser:Arg1> 
      <!--Optional:--> 
      <ser:Arg2>?</ser:Arg2> 
      <!--Optional:--> 
      <ser:Arg3>?</ser:Arg3> 
      <!--Optional:--> 
      <ser:Ws>?</ser:Ws> 
     </tem:inputXml> 
     </tem:Get> 
    </soapenv:Body> 
</soapenv:Envelope> 

IUnderWritingService

[ServiceContract] 
    public interface IUnderWritingService 
    { 
     [OperationContract] 
     UnderWritingOutput Get(UnderWritingInput inputXml); 

    } 
+0

である可能性を認識していなかった。TEM = "http://tempuri.org/"で、最初のxmlは異なる名前空間を示しています。あなたは何をしたいのですか? – rene

+0

ここに投稿された最初のXML iv'eは、私のサービスの入力でなければなりません。 –

+0

しかし、SOAP Webサービスにしたいのですか?単純な投稿のRESTサービスではありませんか? – rene

答えて

1

DataContractシリアライザでXML構造をシリアル化することはできません。なぜなら、要素が異なる名前空間にあるという事実が気に入らないからです。実行すると

var xml = @"<ws:processAcord xmlns:ws=""http://ws.plus.predictivelogic.com/""> 
<arg0>CrlUser</arg0> 
<arg1>CrlPass</arg1> 
<arg2>Life Scope</arg2> 
<arg3 /> 
</ws:processAcord>"; 

var xs = new XmlSerializer(typeof(Input)); 
var rdr = XmlReader.Create(new StringReader(xml)); 
var obj = (Input) xs.Deserialize(rdr); 
obj.Dump(); 

:そのXML形式が必要な場合は、属性[XmlSerializerFormat]

[XmlRoot(ElementName = "processAcord", Namespace = "http://ws.plus.predictivelogic.com/")] 
[XmlSerializerFormat] // tell WCF to not to use the DataContractSerializer 
public class Input 
{ 
    [XmlElement(ElementName = "arg0", Namespace = "")] 
    public string Arg0 { get; set; } 
    [XmlElement(ElementName = "arg1", Namespace = "")] 
    public string Arg1 { get; set; } 
    [XmlElement(ElementName = "arg2", Namespace = "")] 
    public string Arg2 { get; set; } 
    [XmlElement(ElementName = "arg3", Namespace = "")] 
    public string Arg3 { get; set; } 
    [XmlAttribute(AttributeName = "ws", Namespace = "http://www.w3.org/2000/xmlns/")] 
    public string Ws { get; set; } 
} 

次LinqPadテストリグは、この結果をレンダリングしないことを証明している追加することによって、代わりにXmlSerializerを使用するWCFスタックを伝えます、これが結果です:

result of deserialized object

あなたはむしろDataContractSを使用している場合erializerの場合は、arg0、arg1、arg2、arg3の要素もws名前空間にあるようにxmlを変更する必要があります。<ws:arg0>CrlUser</ws:arg0>

次に、サービスがそのペイロードを理解していることを確認します。あなたのServiceContractは、名前空間を保持する必要があります。

[ServiceContract(Namespace="http://ws.plus.predictivelogic.com/"] 
public interface IUnderWritingService 
{ 
    [OperationContract] 
    UnderWritingOutput Get(UnderWritingInput inputXml); 

} 

あなたはこれを明示的に述べるが、のDataContractをSOAPUIがあなたの操作とメッセージは、名前空間 `のxmlnsであると考えてwrapped

+0

こんにちは、私はsoapUIからそれを投稿しているとき、それはシリアル化されていない、私は入力パラメータに 'null'を取得しています。 –

+0

ServiceContractのクラスとインターフェイス、および.configファイルでバインディングが設定されている場合はバインディングを確認する必要があります。 – rene

+0

質問が更新されました。ご覧ください@rene –

-1

あなたはそれをシリアル化可能にするために、入力クラスの[のDataContract]属性を配置する必要があります。また、このクラスの各プロパティをシリアル化する[DataMember]属性で飾ります。

+0

私はその1つを試みたが、成功しなかった。コメントのあるコードを見つけることができます。 –

+0

[DataContract]属性をクラスに配置しようとしましたが、これはあなたのコードでは見えませんか? –

+0

はい、動作しませんでした。 –