2

Webアプリケーションでは、最初に画像が存在するかどうかを確認してから、この画像またはダミー画像を表示する必要があります。

私は次のコードを使用し、次のようなURLで機能します。

  • " http://www.somedomain.com/niceimage.png "
  • https://www.somedomain.com/niceimage.png」。
public virtual bool WebResourceExists(string url)
{
    WebHeaderCollection headers = null;
    WebResponse response = null;
    try
    {
        WebRequest request = WebRequest.Create(url);
        request.Method = "HEAD";
        response = request.GetResponse();
        headers = response.Headers;
        bool result = int.Parse(headers["Content-Length"]) > 0;
        return result;
    }
    catch (System.Net.WebException)
    {
        return false;
    }
    catch (Exception e)
    {
        _log.Error(e);
        return false;
    }
    finally
    {
        if (response != null)
        {
            response.Close();
        }
    }
}

いくつかの場所では、メソッドはのようなプロトコルに依存しないURLで呼び出されます"//www.somedomain.com/niceimage.png"

このようなURLには例外がスローされます。

System.InvalidCastException: Unable to cast object of type 'System.Net.FileWebRequest' to type 'System.Net.HttpWebRequest'

プロトコルに依存しないURLを使用"http:"して、URLの前に追加する方法はありますか?

4

2 に答える 2

3

プロトコルに依存しないURLは、現在のプロトコルを使用してブラウザによって解決され、HTTPSページからのHTTPリクエストの作成を回避するために使用されます。

サーバー上で実行されるコードには、実際には「現在のプロトコル」の概念がありません。ASP.NETは、現在の要求がHTTPまたはHTTPSのどちらで発行されたかを判断できますが、WebRequestクラスはASP.NETアプリケーションに制限されていないため、これに依存することはできません。

プロトコルを指定する必要があります。HTTPとHTTPSのどちらを使用するかは、サーバーと「www.somedomain.com」間の接続を第三者が盗聴することを懸念しているかどうかによって異なります。

于 2012-11-08T14:38:26.413 に答える
0

2段階のプロセスについてはどうでしょうか。httpバージョンを確認してください。存在しない場合は、httpsを確認してください。これがどのように機能するかについての基本的な例をすばやくまとめましたが、適切にテストおよびチェックできないため、整理/リファクタリングが必要になる可能性があります。

public virtual bool WebResourceExists(string url)
{
    WebHeaderCollection headers = null;
    WebResponse response = null;
    try
    {
        if (url.StartsWith(@"//") {
           url = "http:";
        }
        WebRequest request = WebRequest.Create(url);
        request.Method = "HEAD";
        response = request.GetResponse();
        headers = response.Headers;
        bool result = int.Parse(headers["Content-Length"]) > 0;
        return result;
    }
    catch (System.Net.WebException)
    {
        if (url.StartsWith(@"http://") {
           url = url.Replace("http://","https://");
        } else {
           return false;
        }
        try {
            WebRequest request = WebRequest.Create(url);
            request.Method = "HEAD";
            response = request.GetResponse();
           headers = response.Headers;
           bool result = int.Parse(headers["Content-Length"]) > 0;
           return result;
       }
       catch (System.Net.WebException)
       {
            return false;
       }
    }
    catch (Exception e)
    {
        _log.Error(e);
        return false;
    }
    finally
    {
        if (response != null)
        {
            response.Close();
        }
    }
}
于 2012-11-08T15:53:25.543 に答える