0

ユーザー ID とパスワードを使用して Web サイトに接続し、Web サイトからデータを取得してテキスト ファイルに保存したいのですが、メソッドが許可されていないというエラー 405 が表示されます。誰かがこれを理解するのを手伝ってくれますか? Web サーバーの 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();

編集: 問題は解決し、その Web サイトで POST メソッドを許可する別の URL が見つかりました。

4

3 に答える 3

1

@GSiryのソリューションは、データを取得するサーバーを制御する場合に最適な方法です。

それ以外の場合、問題は、リモートサーバーが受け入れるHTTPメソッドにリクエストを調整することです.Method Not Allowedは、サーバーが他のメソッドを受け入れている間、正当な理由で特定のメソッドを使用しないことを意味するはずです. リクエストの安全性と冪等性に関する詳細を参照してください。

POST の代わりに GET を使用するとどうなりますか?

EDIT : HTML フォームと C# リクエストの両方から実際に同じ Web URL に POST していると仮定すると (とにかくそうではないようです)、動作が異なる理由は明らかではなく、実際にはサーバーの実装に依存します。 . つまり、当て推量しかできないことを意味します (たとえば、C# コードから取得したユーザー エージェントが気に入らない (またはユーザー エージェントがない) 場合があります)。

とにかく、私は GET を使用するというアドバイスを支持します。website.com/file.htmlPOST メソッドの目的であるを変更するつもりはないため、POST リクエストを発行する理由はまったくないようです。

EDIT2 : ログイン自体に POST を使用する必要はありません。HTTP 認証は、フォーム パラメーター、HTTP 要求ヘッダー、またはドメイン名の独自の権限部分 ( http://username:password@website.com/your_file.html )を介して実行できます。ただし、これは具体的なサーバーの実装にのみ依存します。

サーバー ログにアクセスできない場合は、試行錯誤を繰り返していることになります。ブラウザのリクエストを正確に模倣することから始めます。Firebug、Chrome、または Safari の開発者コンソールは、POST メソッドが許可されるようにブラウザー リクエストと共に渡されるヘッダーを正確に確認するための友達になります。

余談ですが、認証手順に使用する必要があるのは SSL/TLS ( https ://...) です

于 2013-09-17T18:04:26.193 に答える
1

MVC を使用している場合は、

[HttpPost]

投稿リクエストを受け入れるコントローラー関数への属性

于 2013-09-17T18:02:00.387 に答える
0

WebService にアクセスしようとしている場合は、System.Web の下のターゲットのサイト Web.config に次のセクションを追加します。

<webServices>
   <protocols>
      <add name="HttpPost"/>
   </protocols>
</webServices>
于 2013-09-17T18:16:21.033 に答える