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

本文关键字:HTTP POST 请求 XML WCF 处理 | 更新日期: 2023-09-27 18:29:04

大家好,

根据上面的标题,我试图在WCF中处理来自XMLHTTP的POST请求。实际上,我已经可以通过使用HTTPWebRequest来处理请求,但由于旧库以这种形式发送请求(如代码中所示,我们使用的是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(错误请求)。

提前感谢您的建议。

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

尝试使用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>
感谢您的回复。我更改了内容类型标题:
xmlhttp.setRequestHeader("Content-Type", "application/xml");

它有效!我现在可以更改WCF的xml输入并获得状态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更改为现有应用程序使用的xml。