为什么第二个请求失败了?我可以更改 RestSharp headers 的顺序吗?
Why is the second request failing? Can I change the order of RestSharp headers?
我正在尝试与我的家 mode/route/gateway 连接,它有一个使用 CWMP (TR-69) SOAP 协议(通过 javascript 客户端)的网络 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>
我认为这两个请求基本相同,但是第二个请求失败了。
这里唯一的区别似乎是 header 命令、用户代理和缺少的方法 header.
如何在 RestSharp 中更改 header 的顺序?
更新
我尝试嗅探来自另一个浏览器的原始请求以将其用作基础:
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 class 重新创建请求:它有效,尽管我最后的 objective 是使用 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>
更新 3 我解决了这个问题。
所以我终于找到了问题所在。不是 header.
是坏字符转义的情况。真丢脸。
Dim envelope As String = String.Format("<cwmp:{0} xmlns="">{1}</cwmp:{0}>", action, body)
我没有转义双引号,所以请求总是会因为错误的 XML(xmlns="
属性)而导致 500 错误。
这是最终的工作请求:
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=44D94CDF0F3ECD3C
Content-Length: 232
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Header><DMCookie>1554023074</DMCookie></soapenv:Header><soapenv:Body><cwmp:LoggedUser xmlns=""></cwmp:LoggedUser></soapenv:Body></soapenv:Envelope>
我正在尝试与我的家 mode/route/gateway 连接,它有一个使用 CWMP (TR-69) SOAP 协议(通过 javascript 客户端)的网络 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>
我认为这两个请求基本相同,但是第二个请求失败了。 这里唯一的区别似乎是 header 命令、用户代理和缺少的方法 header.
如何在 RestSharp 中更改 header 的顺序?
更新
我尝试嗅探来自另一个浏览器的原始请求以将其用作基础:
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 class 重新创建请求:它有效,尽管我最后的 objective 是使用 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>
更新 3 我解决了这个问题。
所以我终于找到了问题所在。不是 header.
是坏字符转义的情况。真丢脸。
Dim envelope As String = String.Format("<cwmp:{0} xmlns="">{1}</cwmp:{0}>", action, body)
我没有转义双引号,所以请求总是会因为错误的 XML(xmlns="
属性)而导致 500 错误。
这是最终的工作请求:
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=44D94CDF0F3ECD3C
Content-Length: 232
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Header><DMCookie>1554023074</DMCookie></soapenv:Header><soapenv:Body><cwmp:LoggedUser xmlns=""></cwmp:LoggedUser></soapenv:Body></soapenv:Envelope>