6

私のWCFサービスには次のメソッドがあります。

[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Xml, RequestFormat = WebMessageFormat.Xml)]
public int GetOne(string param1, string param2)
{
    return 1;
}

Flex アプリケーションから xml を送信しています。次のようなオブジェクトを受け取り、{ param1: "test", param2: "test2" }次のリクエストに変換します。

POST http://localhost:8012/MyService.svc/GetOne HTTP/1.1
Accept: application/xml
Accept-Language: en-US
x-flash-version: 10,1,53,64
Content-Type: application/xml
Content-Length: 52
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Host: localhost:8012
Connection: Keep-Alive
Pragma: no-cache
Cookie: ASP.NET_SessionId=drsynacw0ignepk4ya4pou23

<param1>something</param1><param2>something</param2>

エラーが発生しますThe incoming message has an unexpected message format 'Raw'. The expected message formats for the operation are 'Xml', 'Json'.。私が読んだことはすべて、 content-type を にする必要があることを示していますがapplication/xml、何らかの理由で Raw であるとまだ考えています。私のメソッド署名を考えると、それが何を期待しているのか、また、リクエストを XML として受け入れるためにどのようにリクエストを作成する必要があるのか​​について混乱しています。

ここで明らかな何かが欠けていますか?XML を指定して XML を提供しているときに、なぜ RAW であると考えるのですか?

編集- ここに何かが欠けている場合に備えて、ここに Flex 側があります。

var getOneService:HttpService = new HttpService("myURL");

getOneService.method = "POST";
getOneService.resultFormat = "e4x";
getOneService.contentType = HTTPService.CONTENT_TYPE_XML;
getOneService.headers = { Accept: "application/xml" };

getOneService.send({ param1: "test", param2: "test2" });
4

2 に答える 2

4

POSTフレームワークが自動的に逆シリアル化する操作で2つのパラメーターを渡すことはできないと思います。以下のアプローチのいくつかを試しました。

  1. WCF メソッドを次のように定義します。

    [OperationContract]
    [WebInvoke(Method = "POST", 
        BodyStyle = WebMessageBodyStyle.Bare, 
        ResponseFormat = WebMessageFormat.Xml, 
        RequestFormat = WebMessageFormat.Xml, 
        URITemplate="/GetOne/{param1}")]
    public int GetOne(string param1, string param2)
    {
        return 1;
    }
    

    生の POST リクエストは次のようになります。

    POST http://localhost/SampleService/RestService/ValidateUser/myparam1 HTTP/1.1
    User-Agent: Fiddler
    Content-Type: application/xml
    Host: localhost
    Content-Length: 86
    
    <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">my param2</string>
    
  2. WCF REST メソッドを次のように変更します。

    [OperationContract]
    [WebInvoke(Method = "POST", 
        BodyStyle = WebMessageBodyStyle.WrappedRequest, 
        ResponseFormat = WebMessageFormat.Json, 
        RequestFormat = WebMessageFormat.Json)]
    public int GetOne(string param1, string param2)
    {
        return 1;
    }
    

    これで、生のリクエストは次のようになります。

    POST http://localhost/SampleService/RestService/ValidateUser HTTP/1.1
    User-Agent: Fiddler
    Content-Type: application/json
    Host: localhost
    Content-Length: 86
    
    {"param1":"my param1","param2":"my param 2"}
    
  3. WCF REST メソッドを次のように変更します。

    [OperationContract]
    [WebInvoke(Method="POST", 
        BodyStyle=WebMessageBodyStyle.WrappedRequest, 
        ResponseFormat=WebMessageFormat.Xml, 
        RequestFormat= WebMessageFormat.Xml)]
    public int GetOne(string param1, string param2)
    {
       return 1;
    }
    

    これで、生のリクエストは次のようになります。

    POST http://localhost/SampleService/RestService/ValidateUser HTTP/1.1
    User-Agent: Fiddler
    Content-Type: application/xml
    Host: localhost
    Content-Length: 116
    
    <ValidateUser xmlns="http://tempuri.org/"><Username>my param1</Username><Password>myparam2</Password></ValidateUser>
    
于 2012-07-12T08:48:18.917 に答える
1

有効な XML には、単一のルート要素が必要です。また、WCF REST には、XML 要素を文字列パラメーターにマップする魔法はありません。操作パラメーターとして XElement を使用できます。

[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Xml, RequestFormat = WebMessageFormat.Xml)]
public int GetOne(XElement content)
{
    string param1 = content.Elements().First(element => element.Name == "param1").Value;
    string param2 = content.Elements().First(element => element.Name == "param2").Value;

    return 1;
}

送信するデータは次のようになります。

<parameters>
    <param1>something</param1>
    <param2>something</param2>
</parameters>
于 2012-07-11T22:20:53.847 に答える