c# webclient返回403禁止
Posted
技术标签:
【中文标题】c# webclient返回403禁止【英文标题】:c# webclient returns 403 forbidden 【发布时间】:2013-11-28 13:04:00 【问题描述】:我正在尝试模拟在 Steam 中接受交易报价的过程。我已经询问了 Steam 支持,并确认只要我不中断他们对其他玩家的服务,就允许此操作。
所以这里是详细信息: 接受交易报价的网址是https://steamcommunity.com/tradeoffer/OfferID/accept
这是他们这样做的 ajax 代码
return $J.ajax(
url: 'https://steamcommunity.com/tradeoffer/' + nTradeOfferID + '/accept',
data: rgParams,
type: 'POST',
crossDomain: true,
xhrFields: withCredentials: true
这是我使用 IE10 跟踪的标头
Request POST /tradeoffer/xxxxxxx/accept HTTP/1.1
Accept */*
Content-Type application/x-www-form-urlencoded; charset=UTF-8
Referer http://steamcommunity.com/tradeoffer/xxxxxxx/
Accept-Language en-CA
Origin http://steamcommunity.com
Accept-Encoding gzip, deflate
User-Agent Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)
Host steamcommunity.com
Content-Length 51
DNT 1
Connection Keep-Alive
Cache-Control no-cache
帖子正文:
sessionid=SESSIONID&tradeofferid=OfferID
饼干:
Sent sessionid SessionID
Sent __utmc XXXXX
Sent steamLogin XXXXX
Sent webTradeEligibility XXXXXXX
Sent Steam_Language XXXXXXX
Sent timezoneOffset XXXXXXXX
Sent __utma XXXXXXXXXXXXX
Sent __utmz XXXXXXXXXXXXX
Sent steamMachineAuth XXXXXXXXXXXXX
Sent strInventoryLastContext XXXXXXXXX
Sent steamRememberLogin XXXXXXXXXXXX
Sent steamCC_XXXXXXXXXXXX XXXXXXX
Sent __utmb XXXXXXX
Sent tsTradeOffersLastRead XXXXXXX
请求的发起者是XMLHttpRequest
在我的代码中我做了
public bool AcceptOffer(string offerID)
string path = "tradeoffer/" + offerID + "/";
//Simulate the browser opening the trade offer window
_steamWeb.Get(new Uri(WebAPI.SteamCommunity + path));
NameValueCollection data = new NameValueCollection();
data.Add("sessionid", _steamWeb.SessionID);
data.Add("tradeofferid", offerID);
string result = _steamWeb.Post(new Uri("https://steamcommunity.com/" + path + "accept"), data);
return true;
_steamWeb 包含一个可识别 cookie 的网络客户端,用于执行所有 post/get 请求
这里是 cookie 感知网络客户端的部分代码
protected override WebRequest GetWebRequest(Uri address)
HttpWebRequest request = base.GetWebRequest(address) as HttpWebRequest;
if (request != null)
request.CookieContainer = _cookieContainer;
if (_lastPage != null)
request.Referer = _lastPage;
_lastPage = address.ToString();
return request;
protected override WebResponse GetWebResponse(WebRequest request)
WebResponse response = base.GetWebResponse(request);//403 exception here
ReadCookies(response);
return response;
这是我设置的标题
void SetCommonHeaders(Uri uri)
_webClient.Headers[HttpRequestHeader.Accept] = "text/html, application/xhtml+xml, */*";
_webClient.Headers[HttpRequestHeader.AcceptLanguage] = "en-CA";
_webClient.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded; charset=UTF-8";
_webClient.Headers[HttpRequestHeader.UserAgent] = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)";
_webClient.Headers[HttpRequestHeader.Host] = uri.Host;
_webClient.Headers.Add("DNT", "1");
这是我发送的请求的 cookie 标头
sessionid=XXXX;
steamMachineAuthXXXXX=XXXXXX;
steamLogin=XXXXXXX;
steamRememberLogin=XXXXXXXX;
Steam_Language=english;
webTradeEligibility=XXXXXXXXX;
steamCC_XXXXX=CA;
tsTradeOffersLastRead=XXXXXXXXX
我没有手动设置这些 cookie,所有这些 cookie 都通过对 steamcommunity.com 的 GET 请求来处理
我发送的请求几乎与浏览器相同,但我的帖子收到 403 Forbidden。我试图设置 X-Requested-With = XMLHttpRequest 标头,但它没有帮助。我看到他们在 ajax 调用中做一些凭证的事情,所以我想在我的 HttpWebRequest 帖子中也做一些事情吗?谢谢
【问题讨论】:
您可以尝试使用 Fiddler 跟踪两个不同的请求并比较结果吗? 我同意@scheien,使用 Fidler 跟踪您的请求。只是一些额外的信息,你可以下载 Fidler here steam 交易失败了,我想我得等到他们完成了 当您缺少steamLoginSecure
标头时会发生这种情况
【参考方案1】:
问题解决了,有两点:
-
由于 .NET 错误,未能正确发送 Keep alive 标头
我对 sessionid 进行了两次编码
【讨论】:
以上是关于c# webclient返回403禁止的主要内容,如果未能解决你的问题,请参考以下文章
c# Httpclient 请求在 Windows 10 上工作正常返回 403 在 Windows 7 上被禁止(相同的代码)
Google Docs:无法在 C# 中使用管理访问/模拟(禁止 403)导出/下载用户的文档