2016-04-24 27 views
2

リクエストをXML形式で送信する必要があるサービスがあります。SOAPサービスにリクエストを送信するためのXMLシリアル化C#

私は、xsd.exeツールを使用してxsd.exeツールを使用して、xmlattributesを自動的に作成するクラスを生成しました。

しかし、私はこのクラスに値を設定する必要がありますが、喜びはありません。だから私は、クラス内のプロパティを設定し、それをSOAPリクエストに渡してSOAPサービスに送りたいと思っています。

クラスの例は次のとおりです。私はプライバシーのために部分的な情報しか示していません。

public partial class Request { 

    private string[] itemsField; 

    private ItemsChoiceType[] itemsElementNameField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute("Name", typeof(string), Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
    [System.Xml.Serialization.XmlElementAttribute("Address1", typeof(string), Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
    [System.Xml.Serialization.XmlElementAttribute("Town", typeof(string), Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
    [System.Xml.Serialization.XmlElementAttribute("County", typeof(string), Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 

[System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemsElementName")] 
    public string[] Items { 
     get { 
      return this.itemsField; 
     } 
     set { 
      this.itemsField = value; 
     } 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute("ItemsElementName")] 
    [System.Xml.Serialization.XmlIgnoreAttribute()] 
    public ItemsChoiceType[] ItemsElementName { 
     get { 
      return this.itemsElementNameField; 
     } 
     set { 
      this.itemsElementNameField = value; 
     } 
    } 
} 

/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] 
[System.SerializableAttribute()] 
[System.Xml.Serialization.XmlTypeAttribute(IncludeInSchema=false)] 
public enum ItemsChoiceType { 

    /// <remarks/> 
    Name, 

    /// <remarks/> 
    Address1, 

    /// <remarks/> 
    Town, 

    /// <remarks/> 
    County 
} 

クラスを作成してxmlserializerを使用してリクエストをサービスに送信するにはどうすればよいですか。事前

よろしく

TJ

+0

あなたはSOAPサービスのWSDLへのアクセス権を持っていますか? SOAPエンベロープを作成するには、この情報が必要です。 SOAPサービスを呼び出すには、データコントラクトだけでは不十分です。 –

+0

こんにちは、ええ、私はsoapUIを使用してテストしているので、それは大丈夫になるアクセスがあります。だから問題は、私は要求に入れているXMLを生成する必要があります。したがって、クラスの人口は – tjhack

答えて

2

おかげでどのように私はあなたがのインスタンスを作成することにより開始することができます任意の通常の.NETクラスと同じように、クラス

を移入することができますこのインスタンスのプロパティ値を設定します。

var request = new Request(); 
request.Items = new[] { "item1", "item2" }; 
request.ItemsElementName = new[] 
{ 
    ItemsChoiceType.Name, 
    ItemsChoiceType.Address1, 
}; 

を使用し、xmlserializerを使用してリクエストをサービスに送信します。

これは難しい部分です。まず、XmlSerializerクラスは、その名前が示すとおり、XMLにシリアライズするために使用でき、要求を送信することはできません。次に、XmlSerializerはSOAPサービスに必要なSOAPエンベロープを生成しません。要求XMLに加えて、SOAPエンベロープには、呼び出すメソッドに関する情報が含まれています。

私は、WSDLからC#クライアントとの契約を作成するためにsvcutil.exe以降を使用して、あなたをお勧めします:

svcutil.exe http://someservice.com/?WSDL 

これは、より最近のDataContract属性を使用すると、あなたがリクエストを送信するためにWCFクライアントを使用することができます。あなたはSOAPサービスの実際の名前空間と、適切な操作名に置き換える必要があります。この例では明らかに

[System.ServiceModel.ServiceContract(Namespace="http://service.namespace")] 
public interface IMyService 
{ 
    [System.ServiceModel.OperationContract(Action="http://service.namespace/SomeServiceMethod", ReplyAction="*")] 
    [System.ServiceModel.XmlSerializerFormat(SupportFaults=true)] 
    void SomeServiceMethod(Request request); 
} 

:これは、リモートサービスを呼び出すために使用することができますのServiceContractインターフェイスを作成します。

そして最後に、あなたはオペレーションを呼び出すことができます:

var binding = new BasicHttpBinding(); 
var endpoint = new EndpointAddress("http://example.com/myservice"); 
var channelFactory = new ChannelFactory<IMyService>(binding, endpoint); 
var client = channelFactory.CreateChannel(); 
client.SomeServiceMethod(request); 
+0

ありがとうございます。 – tjhack

+0

svcutil.exeはインターフェイスを作成するのではなく、契約の.csファイルだけを作成します。私はどのようにインターフェイスを作成することができますか? – tjhack

+0

これは、WSDLは持っておらず、契約にはXSDしかないことを意味します。 WSDLがない場合は、ServiceContractインターフェイスを手動で作成できます。もちろん、メソッド名とサービス名前空間を知っていなければなりません。 –

関連する問題