在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(错误请求)。
提前感谢您的建议。
尝试使用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。