【问题标题】:Web Server Does Not Allow Using Post MethodWeb 服务器不允许使用 Post 方法
【发布时间】:2013-09-17 17:55:12
【问题描述】:

我想用我的用户名和密码连接一个网站,并从网站获取我的数据并将它们存储在一个文本文件中,但我收到错误 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 方法的 URL。

【问题讨论】:

  • 这意味着你的网址有误。
  • 我没有使用确切的地址我在更改时更改了它我犯了一个错误。我现在修好了
  • 请显示您要发布到的方法的签名和代码
  • 请发布有关他的服务器端代码和架构的更多信息
  • 您是在尝试连接到 WebService 还是纯 HTML 文件?

标签: c# javascript html http


【解决方案1】:

如果您控制从中获取数据的服务器,@GSiry 的解决方案可能是可行的方法。

否则,问题在于将您的请求调整为远程服务器接受的任何 HTTP 方法:不允许的方法应该意味着服务器在接受其他方法时不会采用某些特定方法,这是有充分理由的。在request safety and idempotence 上查看更多信息。

如果您使用 GET 而不是 POST 会发生什么?

编辑:假设您确实是从 HTML 表单和 C# 请求发布到同一个 Web URL(无论如何似乎并非如此),其行为不同的原因是不明显,实际上是依赖于服务器实现的。这意味着我们只能进行猜测(例如,它可能不像从 C# 代码中获得(或缺少)的 user agent

无论如何,我坚持使用 GET 的建议。似乎根本没有理由发出 POST 请求,因为您不打算修改 website.com/file.html,这是 POST 方法的既定目的。

EDIT2:不需要使用 POST 登录本身。 HTTP 身份验证可以通过表单参数、H​​TTP 请求标头或域名自身的权威部分(http://username:password@website.com/your_file.html)来执行。但这完全取决于具体的服务器实现。

如果您无法访问服务器日志,恐怕您正在经历一些试错环节。首先完全模仿浏览器的请求。 Firebug、Chrome 或 Safari 的开发者控制台将成为您的朋友,您可以准确查看哪些标头与浏览器请求一起传递,从而允许使用 POST 方法。

附带说明,您应该用于身份验证过程的是 SSL/TLS (https://...)

【讨论】:

  • 我希望他能发布更多关于他的服务器端代码和架构的信息
  • 它与 GET 方法一起使用。我得到了从网站复制到我的 Richtextbox 对象的所有 html 代码。但是在该方法旁边的网站的 html 代码中有一个我无法理解的东西,有一个 post 方法,使用浏览器我将数据发布到服务器并且它可以工作,但为什么不能在 C# 中工作?请理解,因为我是网络编码的新手。
  • 服务器不是我的,我只知道上面关于服务器的代码
  • 可以用浏览器将数据发布到网站是可以的,但不能用C#发布数据我真的无法理解这背后的逻辑。有人可以解释一下吗?
  • @user1895421 阅读我的编辑:它行为不同的原因并不明显,实际上取决于服务器实现。这意味着我们只能做猜测。可能是用户代理。
【解决方案2】:

如果你使用的是 MVC,它可能就像添加

一样简单
[HttpPost]

归因于接受您的发布请求的控制器函数

【讨论】:

    【解决方案3】:

    如果您尝试访问 WebService,请在 System.Web 下的目标站点 Web.config 中添加以下部分:

    <webServices>
       <protocols>
          <add name="HttpPost"/>
       </protocols>
    </webServices>
    

    【讨论】:

    • 我不能添加这个,因为服务器不是我的。
    • 好吧,如果你不能控制它并且不能要求那些做改变的人,并且服务器不允许这些请求 - 你无能为力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 2011-10-01
    • 1970-01-01
    • 2012-06-11
    • 2017-07-16
    • 2016-02-15
    相关资源
    最近更新 更多