【发布时间】:2016-03-16 21:06:08
【问题描述】:
我正在尝试与具有使用 CWMP (TR-69) SOAP 协议(通过 javascript 客户端)管理配置的 Web UI 的家庭模式/路由/网关进行交互。
我正在尝试复制(不需要完全相等,但只是为了工作)js 客户端使用 RestSharp 完成的第一个请求,但它总是失败并出现 500 内部错误。
这是来自 javascript 的 RAW 请求:
POST http://vodafone.station/data_model.cgi HTTP/1.1
Content-Type: text/xml; charset="utf-8"
Accept: application/xml, text/xml, */*; q=0.01
Method: POST
SOAPAction: cwmp:LoggedUser
X-Requested-With: XMLHttpRequest
Referer: http://vodafone.station/main.cgi?page=about.html
Accept-Language: it-IT
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko
Content-Length: 230
Host: vodafone.station
Connection: Keep-Alive
Pragma: no-cache
Cookie: wbm_cookie_session_id=5D2D2E84416DB43D
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Header><DMCookie>70972421</DMCookie></soapenv:Header><soapenv:Body><cwmp:LoggedUser xmlns=""></cwmp:LoggedUser></soapenv:Body></soapenv:Envelope>
这是我的应用程序使用 RestSharp 发布的 RAW 请求:
POST http://vodafone.station/data_model.cgi HTTP/1.1
Accept: application/xml, text/xml, */*; q=0.01
SOAPAction: cwmp: LoggedUser
Pragma: no-cache
X-Requested-With: XMLHttpRequest
Referer: http://vodafone.station/main.cgi?page=index.html
Accept-Language: it-IT
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36
Content-Type: text/xml
Host: vodafone.station
Cookie: wbm_cookie_session_id=29374DCA6F4B4B8B
Content-Length: 230
Accept-Encoding: gzip, deflate
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Header><DMCookie>657122696</DMCookie></soapenv:Header><soapenv:Body><cwmp:LoggedUser xmlns="></cwmp:LoggedUser></soapenv:Body></soapenv:Envelope>
我相信这两个请求基本相同,但第二个请求失败。 这里唯一的区别似乎是标头顺序、用户代理和缺少的方法标头。
如何更改 RestSharp 中标题的顺序?
更新
我尝试从另一个浏览器嗅探原始请求以将其用作基础:
POST http://vodafone.station/data_model.cgi HTTP/1.1
Host: vodafone.station
Connection: keep-alive
Content-Length: 232
Origin: http://vodafone.station
Method: POST
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.109 Safari/537.36 Vivaldi/1.0.418.3
Content-Type: text/xml; charset="UTF-8"
Accept: application/xml, text/xml, */*; q=0.01
X-Requested-With: XMLHttpRequest
SOAPServer:
SOAPAction: cwmp:LoggedUser
DNT: 1
Referer: http://vodafone.station/main.cgi?page=about.html
Accept-Encoding: gzip, deflate
Accept-Language: it-IT,it;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: wbm_cookie_session_id=1FD0F3015AA2D293
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Header><DMCookie>1795351746</DMCookie></soapenv:Header><soapenv:Body><cwmp:LoggedUser xmlns=""></cwmp:LoggedUser></soapenv:Body></soapenv:Envelope>
这一次我使用 System.Net.HttpWebRequest 类来重新创建请求:它可以工作,尽管我的最终目标是使用 RestSharp 来实现。
所以,这行得通:
POST http://vodafone.station/data_model.cgi HTTP/1.1
Origin: http://vodafone.station
Method: POST
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.109 Safari/537.36 Vivaldi/1.0.418.3
Content-Type: text/xml; charset="UTF-8"
Accept: application/xml, text/xml, */*; q=0.01
X-Requested-With: XMLHttpRequest
SOAPServer:
SOAPAction: cwmp:LoggedUser
DNT: 1
Referer: http://vodafone.station/main.cgi?page=about.html
Accept-Encoding: gzip, deflate
Accept-Language: it-IT,it;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: wbm_cookie_session_id=04B71CB985477F19
Host: vodafone.station
Content-Length: 228
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Header><DMCookie>155497</DMCookie></soapenv:Header><soapenv:Body><cwmp:LoggedUser xmlns=""></cwmp:LoggedUser></soapenv:Body></soapenv:Envelope>
更新 2
我确实尝试使用 RestSharp 发出上述请求:
所以,这里是代码:
Function GetLoggedUser() As RestSharp.RestResponse
Dim T As New TokenAndCookieGetter
Dim xaction As String = "LoggedUser"
Dim xbody As String = Envelope(T.DM_COOKIE, xaction)
Dim req = New RestSharp.RestRequest("/data_model.cgi", RestSharp.Method.POST)
req.AddHeader("Origin", "http://vodafone.station")
req.AddHeader("Method", "POST")
req.AddHeader("Accept", "application/xml, text/xml, */*; q=0.01")
req.AddHeader("X-Requested-With", "XMLHttpRequest")
req.AddHeader("SOAPServer", "")
req.AddHeader("SOAPAction", "cwmp:" + xaction)
req.AddHeader("DNT", "1")
req.AddHeader("Referer", "http://vodafone.station/main.cgi?page=about.html")
req.AddHeader("Accept-Encoding", "gzip, deflate")
req.AddHeader("Accept-Language", "it-IT,it;q=0.8,en-US;q=0.6,en;q=0.4")
'Cookie is already set in T.CLIENT, by assigning a CookieContainer.
req.AddHeader("Host", "vodafone.station")
req.AddParameter("text/xml; charset=""UTF-8""", xbody, RestSharp.ParameterType.RequestBody)
Return T.CLIENT.Execute(req)
End Function
这是相应的请求,但失败了:
POST http://vodafone.station/data_model.cgi HTTP/1.1
Origin: http://vodafone.station
Method: POST
Accept: application/xml, text/xml, */*; q=0.01
X-Requested-With: XMLHttpRequest
SOAPServer:
SOAPAction: cwmp:LoggedUser
DNT: 1
Referer: http://vodafone.station/main.cgi?page=about.html
Accept-Encoding: gzip, deflate
Accept-Language: it-IT,it;q=0.8,en-US;q=0.6,en;q=0.4
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.109 Safari/537.36 Vivaldi/1.0.418.3
Content-Type: text/xml; charset="UTF-8"
Host: vodafone.station
Cookie: wbm_cookie_session_id=3FD15C2D16783BDD
Content-Length: 231
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Header><DMCookie>1534303835</DMCookie></soapenv:Header><soapenv:Body><cwmp:LoggedUser xmlns="></cwmp:LoggedUser></soapenv:Body></soapenv:Envelope>
【问题讨论】:
-
@Eser 那个标头有问题吗?
标签: .net vb.net http soap restsharp