为什么第二个请求失败了?我可以更改 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>