1

私は何かが欠けていると感じているので、これを正しくしようとしています。オブジェクトusingがあるときはいつでもキーワードを使用したい。IDisposableコードが機能することに注意してください。最適化したいだけです。

ここで 2 つの質問があります。

1) このコードの場合:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

そんな追加する意味(HttpWebRequest)あるの?に変換WebRequestしていHttpWebRequestますか?

なぜ私はこれを行うことができないのですか?

HttpWebRequest rq = new HttpWebRequest();
rq.Create(url);

using2) 以下の機能コードで、該当する場合にキーワードを使用するにはどうすればよいですか?

public static int UploadFileToixLibrary(string url, string file)
{
    NetworkCredential credentials = new NetworkCredential();
    credentials.UserName = AppVars.Username;
    credentials.Password = AppVars.Password;

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 

    request.Credentials = credentials;
    request.Method = "POST";
    request.ContentType = "image/tiff";
    request.Headers.Add("X-Object-Key", Path.GetFileName(file));

    byte[] bytes = File.ReadAllBytes(file);
    Stream st = null;

    try
    { 
        request.ContentLength = bytes.Length;   
        st = request.GetRequestStream();
        st.Write(bytes, 0, bytes.Length);         
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
        return 1;
    }
    finally
    {
        if (st != null)
        {
            st.Close();
        }
    }

    try
    {
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();

        StreamReader sr = new StreamReader(response.GetResponseStream());
        response.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
        return 1;
    }

    return 0;
}
4

3 に答える 3

3

質問1:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

キャストの理由は、静的Createメソッド onが、URL で指定したスキームに最も適しWebRequestたインスタンスを返すためです (つまり、http:// アドレスは を返し、ftp:// はなどを返します)。URL が http であることがわかっているので、 が返されることがわかっているので、適切な型に明示的にキャストして、abstract を介した追加機能にアクセスできます。WebRequestHttpWebRequestFtpWebRequestHttpWebRequestHttpWebRequestWebRequest

現在、は でWebRequestはないIDisposableため、using ステートメント内では使用できません。

using質問 2: 機能コードでステートメントを使用できる唯一の場所は、Streamアクセスの周りです。

try
{ 
    request.ContentLength = bytes.Length;   
    st = request.GetRequestStream();
    st.Write(bytes, 0, bytes.Length);         
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
    return 1;
}
finally
{
    if (st != null)
    {
        st.Close();
    }
}

書き直すことができます:

request.ContentLength = bytes.Length;   
using(var st = request.GetRequestStream())
{
    st.Write(bytes, 0, bytes.Length);         
    st.Close();
}
于 2012-08-16T15:00:15.147 に答える
1
  1. WebRequestは抽象クラスであるため、使用するプロパティ/メソッドのほとんどを公開していません。使用するには、適切な型にキャストする必要があります。静的メソッドは、URL に従ってCreate特殊化されたオブジェクトを返します。WebRequestこの URL は HTTP プロトコル ( http://) を使用することがわかっているので、安全に にキャストできHttpWebRequestます。ただし、FtpWebRequest.
  2. GetRequestStreamステートメント内に初期化を入れることができますusing(...)WebRequest(およびその子) が実装されていないように見えますIDisposable
于 2012-08-16T15:00:02.497 に答える
0

1.Webrequest.CreateメソッドはWebRequest参照を返しますが、実際のオブジェクトは、実行したい要求の種類に応じて異なる型を持っています。あなたの場合、HTTP リクエストを行っているので、実際のオブジェクトはHttpWebRequestオブジェクトです。HttpWebRequestオブジェクトの実際の型への参照をキャストして、クラスに固有のメンバーにアクセスします。

2.HttpWebRequest使い捨てではありません。オブジェクトにusingブロックを使用します。HttpWebResponse

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) {
  ...
}
于 2012-08-16T15:06:11.463 に答える