大家好,大家好,
按照上面的标题,我试图在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(错误请求)。
提前感谢您的建议。
答案 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更改为我们现有应用程序使用的请求。