我想用我的用户ID和密码连接一个网站,从网站上获取我的数据并将它们存储在一个文本文件中,但是我得到错误405,方法不允许。有人可以帮我解决这个问题吗? 这是webserver的html代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>blablbablablabl</title>
</head>
<script type="text/javascript">
function login() {
setTimeout('window.close()',1000);
}
</script>
<body>
<div><h3>blablablaasdasd</h3><form onSubmit="javascript:login();" style='margin- top:10px;' id='loginPageForm' action='http://website.com' method='post' target='_blank'
<div>
<input name='t:ac' type='hidden' value='$002f$002website.com$002fclient$002fdefault$002fsearch$002faccount$003f' />
<input name='t:formdata' type='hidden' value='H4sIAAAAAAAAAJWQv0oDQRDGx4NAMJ1gEURstN2zMI02BkEQDgkc1mFvb7xs2Ntdd/ZMbKx8CRufQKz0CVLY+Q4+gI2FlYV7J6Lg/274mJnv932XD9CarMAyIXdiFA+4d0YnppB6czysCJ3mJZKDnnEF45aLETLPLZJ3Jz0mjEMlM5ZxQtbPgsiF35Wo8tUUfWXXDmad+8Xb5wjmEugIo8N3tR8+elhIxvyYx4rrIk69k7rYmloP8++uf8Hq/xdr4IxAorTKSkkkjZ5d5RuHTxd3EcDUfmtpOdHEuJyO4BSgwXyTfr2pT1qTJeh+sUU1hw9Btn8MIkxpjUbtiTXk/nOO8/Sxe3N9thNBlEBbKBm29xrvunpUWAahrr6R6qrbr+bD9Q/jCx9ggTUPAgAA' /></div>
<label for='identity'>Card Number:</label><div><input type='text' name='j_username' /</div>
<div style='clear:both;'></div>
<label for='password'>Password:</label>
<div><input name='j_password' type='password' class='pass' value='' /><input type='submit' value='Login' /></div></form></div>
</body>
</html>
以下是我尝试访问服务器的C#代码。
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://website.com/file.html");
request.AllowAutoRedirect = true;
request.Timeout = 10000; // timeout 10s
request.Method = "POST";
String formContent = "t:ac=$002f$002website.com$002fclient$002fdefault$002fsearch$002faccount$003f&t:formdata=H4sIAAAAAAAAAJWQv0oDQRDGx4NAMJ1gEURstN2zMI02BkEQDgkc1mFvb7xs2Ntdd/ZMbKx8CRufQKz0CVLY+Q4+gI2FlYV7J6Lg/274mJnv932XD9CarMAyIXdiFA+4d0YnppB6czysCJ3mJZKDnnEF45aLETLPLZJ3Jz0mjEMlM5ZxQtbPgsiF35Wo8tUUfWXXDmad+8Xb5wjmEugIo8N3tR8+elhIxvyYx4rrIk69k7rYmloP8++uf8Hq/xdr4IxAorTKSkkkjZ5d5RuHTxd3EcDUfmtpOdHEuJyO4BSgwXyTfr2pT1qTJeh+sUU1hw9Btn8MIkxpjUbtiTXk/nOO8/Sxe3N9thNBlEBbKBm29xrvunpUWAahrr6R6qrbr+bD9Q/jCx9ggTUPAgAA&j_username=johndoe0&j_password=12345";
byte[] byteArray = Encoding.UTF8.GetBytes(formContent);
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = byteArray.Length;
Stream dataStream = request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
// Get the response ...
WebResponse response;
response = (HttpWebResponse)request.GetResponse();//ERROR OCCURS HERE!!!
dataStream = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
richTextBox1.AppendText(HttpUtility.UrlDecode(reader.ReadToEnd()));
reader.Close();
dataStream.Close();
response.Close();
编辑:问题解决后,在该网站中找到了另一个允许POST方法的网址。
答案 0 :(得分:1)
如果您使用MVC,可能就像添加
一样简单[HttpPost]
属性为接受您的帖子请求的控制器功能
答案 1 :(得分:1)
否则,问题在于将请求调整为远程服务器接受的任何HTTP方法:Method Not Noted应该意味着服务器在接受其他方法时不会采用某些特定方法,并且有充分理由。有关request safety and idempotence的更多信息,请参阅。
如果您使用GET而不是POST,会发生什么?
编辑:假设您实际上是从HTML表单和C#请求发送到同一个Web URL(无论如何都不是这样),其行为不同的原因是不明显,实际上是服务器实现依赖的。这意味着我们只能做猜测(例如,它可能不喜欢它从C#代码获得(或缺少){。{}}。
无论如何,我坚持使用GET的建议。似乎没有理由发出POST请求,因为您不打算修改website.com/file.html
,这是POST方法的明确目的。
EDIT2 :无需使用POST登录本身。 HTTP身份验证可以通过表单参数,HTTP请求标头或域名(user agent)自己的权威部分来执行。但这完全取决于具体的服务器实现。
如果您无法访问服务器日志,我担心您会参加一些试错会话。首先模仿浏览器的请求完全。 Firebug,Chrome或Safari的开发者控制台将成为您的朋友,以确切了解哪些标头与浏览器请求一起传递,以便允许POST方法。
另一方面, 用于身份验证程序的内容是SSL / TLS( https :// ...)
答案 2 :(得分:0)
如果您正在尝试访问WebService,请将以下部分添加到System.Web下的目标站点Web.config:
<webServices>
<protocols>
<add name="HttpPost"/>
</protocols>
</webServices>