0

XMLペイロードでリクエストを読み取り、これらのリクエストに応答するWCFサービスがあります。たとえば、単純なログイン リクエストは次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<LoginRequest>
    <username>test</username>
    <password>foo</password>
</LoginRequest>

これで、サービス メソッドで単純に受け入れることができることがわかりXElementましたが、基礎となるシステムに上記の XML を読み取り、それをそのような形式の関数呼び出しに変換する方法を伝える方法はありますか。

public LoginResponse Login (string username, string password); 

そのようなことは可能ですか?

4

2 に答える 2

0

はい、可能です。

a) xmlをに変更した後

<Login>
     <username>test</username>
     <password>foo</password>
</Login>

b)[ServiceContract]に置き換える [ServiceContract(Namespace = "")]

c)メソッドを次のように宣言する

[OperationContract]
[WebInvoke(RequestFormat = WebMessageFormat.Xml, 
           ResponseFormat = WebMessageFormat.Xml, 
           BodyStyle = WebMessageBodyStyle.Wrapped)]
public string Login(string username, string password){}

それは動作します...。

これが私がテストに使用したコードです

public void TestWCFService()
{
    //Start Server
    Task.Factory.StartNew(
        (_) =>
        {
            Uri baseAddress = new Uri("http://localhost:8080/Test");
            WebServiceHost host = new WebServiceHost(typeof(TestService), 
                                                     baseAddress);
            host.Open();
        }, null, TaskCreationOptions.LongRunning).Wait();


    //Client
    string xml = @"<Login>
                      <username>test</username>
                      <password>foo</password>
                  </Login>";

    var wc = new WebClient();
    wc.Headers.Add("Content-Type", "application/xml; charset=utf-8");
    var result = wc.UploadString("http://localhost:8080/Test/Login", xml);
}

[ServiceContract(Namespace = "")]
public class TestService
{
    [OperationContract]
    [WebInvoke(RequestFormat = WebMessageFormat.Xml, 
               ResponseFormat = WebMessageFormat.Xml, 
               BodyStyle = WebMessageBodyStyle.Wrapped)]
    public string Login(string username, string password)
    {
        return username + " " + password;
    }
}
于 2012-10-31T22:03:58.060 に答える
0

指定したXMLが実際にそのままの形式で機能するとは思わない。入ってくるSOAPメッセージを変更しない限り、内部のXMLは複数の値ではなく単一の文字列値(現在のように)として認識されるためです。

.NETクライアントがある場合は、SOAP形式へのシリアル化と逆シリアル化の方法をすでに知っているクライアント側(またはプロキシオブジェクト)で、DataContract属性で装飾された同じクラスを利用することをお勧めします。XMLペイロードを送信しているクライアントを指定しないため、XMLがすでにSOAPエンベロープにラップされており、「より正確」にするために両側でオーバーホールが必要になる可能性があります。

さらに、ここで行ったことにより、実際のSOAPリクエストは、XML値だけでなく、引数として渡すために大幅に変更する必要があります。

ですから、最終的な答えはノーだと思います。これを行うために、WCFサービスだけを変更することはできません。

于 2012-10-31T16:39:52.233 に答える