在WCF中处理来自XML HTTP的POST请求

时间:2012-03-27 09:43:16

标签: c# wcf

大家好,大家好,

按照上面的标题,我试图在WCF中处理来自XML HTTP的POST请求。实际上,我已经可以通过使用HTTP Web Request来处理请求了,但是由于旧库以这种形式发送请求(如在代码中,我们使用的是MSXML2命名空间),我们必须在这里维护这个要求。

以下是前端的代码(将发送请求的旧库)

MSXML2.ServerXMLHTTP xmlhttp = new MSXML2.ServerXMLHTTP();                 
xmlhttp.open("POST", "http://localhost/RestService/RestServiceImpl.svc/auth", false);
xmlhttp.setRequestHeader("User-Agent", "Jakarta Commons-HttpClient/2.0.2");
String ClientRequest = @"<?xml version=""1.0"" encoding=""UTF-8"" standalone= ""yes""?>   <RequestData xmlns=""http://www.eysnap.com/mPlayer""> <details>Ashu|29|7 Years|.NET</details></RequestData>";

xmlhttp.send(ClientRequest);
int readyState = xmlhttp.readyState;
int status = xmlhttp.status;

虽然这里是WCF的代码,我没能处理它:

public ResponseData Auth(RequestData rData)        
    {
        try
        {
            Logger.log.Info("attempting to send request");
            // Call BLL here
            var data = rData.details.Split('|');

            var response = new ResponseData                
            {
                Name = data[0],
                Age = data[1],
                Exp = data[2],
                Technology = data[3]
            };

            Logger.log.Info("Sending request...");
            return response;
        }

        catch(System.Exception ex)
        {
            Logger.log.Fatal(ex.Message);
            return null;
        }

    }

在web.config中,我已经将绑定更改为“customBinding”而不是“webHttpBinding”,因为我的RAW格式错误而不是JSON格式的请求。

在搜索论坛和其他网站后,我尝试相应地更改了web.config,但却得到了xmlhttp状态400(错误请求)。

提前感谢您的建议。

2 个答案:

答案 0 :(得分:0)

尝试使用Fiddler监控您的请求,并查看RAW请求的外观。它应该如下所示:

POST http://localhost/RestService/RestServiceImpl.svc/auth HTTP/2.0
Content-Type: application/xml
Content-Length: 47

<RequestData xmlns="http://www.eysnap.com/mPlayer"xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><details>Ashu|29|7 Years|.NET</details></RequestData>

答案 1 :(得分:0)

感谢您的回复。我更改了Content-Type标题:

xmlhttp.setRequestHeader("Content-Type", "application/xml");

有效!我现在可以将xml输入更改为WCF并获得状态200.

然而,对于使用Fiddler的监控,我确实打开了Fiddler,但我不确定我是否做到了这一点:

POST http://localhost:3015/default.aspx HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Referer: http://localhost:3015/default.aspx
Accept-Language: en-MY
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: localhost:3015
Content-Length: 220
Connection: Keep-Alive
Pragma: no-cache
Cookie: ASP.NET_SessionId=qdzso1frp32nzw1yyca0xkev

    __VIEWSTATE=%2FwEPDwUKLTUwNDQwMTA1MGRk2SgUm9rav%2BZYiqZHo5PtLZx1Eh67%2BxU309q4TRd3NLU%3D&    __EVENTVALIDATION=%2FwEWBAKr8%2BqJAQLj5PzKCwKM54rGBgLs0bLrBr7W%2BQ74Ywyf9FnYR2DQIpRMPmXllwC5V5bOZfXnofpY&Button1=XML+HTTP&TextBox1=

因此,我没有像你上一篇文章那样得到预期的结果。在打开我的示例Web应用程序之前,我是否应该先做任何其他设置?

顺便说一句,如何从数据合同中删除命名空间?

<RequestData xmlns=""http://www.eysnap.com/mPlayer""><details>Ashu|29|7 Years|.NET</details></RequestData>

是旧请求,我尝试更改为:

<RequestData><details>Ashu|29|7 Years|.NET</details></RequestData>

并在RequestData类中:

[DataContract()]    
public class RequestData
{
    [DataMember]        
    public string details { get; set; }
}

这是因为实际存在的请求没有命名空间。现在我收到错误400以删除命名空间。是否可以首先删除命名空间?

谢谢

已编辑:我将DataContract更改为:

[DataContract(Namespace="")]    
public class RequestData
{
    [DataMember]        
    public string details { get; set; }
}

并设法将HTTP状态设置为200!现在我正在尝试将请求xml更改为我们现有应用程序使用的请求。