2012-03-27 95 views
0

大家好,祝大家好,在WCF处理来自XML HTTP的POST请求

根据上述标题,我试图处理来自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 status 400(Bad Request)。

在此先感谢您的建议。

+0

您是否试图使用Fiddler监视您的请求?此外,RAW消息是由于您的请求未设置Content-Type标题属性。只需将其设置为application/xml或application/json,即可得到解决 – Rajesh 2012-03-27 11:28:58

回答

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> 
+0

Hi Rajesh,谢谢你的回复。我更改了Content-Type标题:xmlhttp.setRequestHeader(“Content-Type”,“application/xml”); 它的工作原理!我现在可以更改xml输入到WCF并获得状态200. 但是,对于使用Fiddler进行监控,我确实打开了Fiddler,但我不确定是否正确: – SmileForMe 2012-03-28 04:35:34

+0

我如何发布json这个xml有属性xmlns?我使用node.js请求。 – 2017-11-25 22:13:11

0

感谢您的答复。我改变了内容类型标题:

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

它的工作原理!我现在可以在XML输入更改为WCF和获取状态200

然而,对于使用招的监控,我没有打开提琴手,但我不知道如果我得到这个权利:

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更改为我们现有应用程序使用的请求。

+0

上面的请求是当你执行一个按钮点击一个网页,它将数据发布到在提琴手中捕获的服务器。以类似的方式,当你打电话给Web服务时,它将被捕获。 – Rajesh 2012-03-28 08:24:11

+0

感谢您的回复。我不确定如何获得在小提琴手中获得的结果。但我想我会首先制作一些示例应用程序:) – SmileForMe 2012-03-28 08:35:02

+0

只需安装Fiddler(http://www.fiddler2.com/fiddler2/),然后在执行对服务的调用之前,只需打开Fiddler即可。它会捕获80端口上的任何流量。 – Rajesh 2012-03-28 08:38:27