WCF REST:期望我的 XML 在请求中看起来像啥?
Posted
技术标签:
【中文标题】WCF REST:期望我的 XML 在请求中看起来像啥?【英文标题】:WCF REST: What is it expecting my XML to look like in requests?WCF REST:期望我的 XML 在请求中看起来像什么? 【发布时间】:2012-07-11 11:13:00 【问题描述】:我的 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'.
。我读过的所有内容都表明我只需要内容类型为application/xml
,但由于某种原因它仍然认为它是原始的。鉴于我的方法签名,我对它的期望以及我需要如何形成请求以便它将其作为 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" );
【问题讨论】:
您将响应格式设置为 xml 并且您将 JSON 格式的输入设为 param1: "test", param2: "test2"
?这样好吗
我还想指出,这个 ' param1: "test", param2: "test2" ' 不是您声称发送数据的 XML 格式。提供您的 Flex 代码您用来调用该服务可能会有所帮助。
@WaqarJanjua:这就是 Flex 对象表示法。它被序列化为您在我发布的请求中看到的 XML。
好的,1 个问题,GetOne 方法返回一个整数,但您在 webinvoke 属性中设置了 Method="POST" ?它不应该是 Get ?
@www.Flextras.com:发布了服务调用,但即使在 Fiddler 中处理请求时,我也无法将其识别为 XML。
【参考方案1】:
我认为你不能通过 POST
操作传递 2 个参数,以便框架自动反序列化它。您已经尝试了以下一些方法:
将您的 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>
将您的 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"
将您的 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>
【讨论】:
你的最后一个建议最终成为了我的选择。在进行最终请求之前,我只需要在 Flex 端写一些东西来始终用方法名称包装参数。谢谢!【参考方案2】:有效的 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>
【讨论】:
以上是关于WCF REST:期望我的 XML 在请求中看起来像啥?的主要内容,如果未能解决你的问题,请参考以下文章
在 Wcf REST 中,返回请求较少的较大模型还是返回请求较多的较小模型更好