0

C#.NETWebアプリケーションに単純な一方向のWebサービスがあります。指定されたURLから画像をダウンロードして、サーバーに保存する必要があります。

ただし、サービスを呼び出すたびに、完全に機能します。また、webClient.DownloadFile行で「スレッドが中止されました」という例外が発生することもあります。

WebClientがHttpContext.Currentへのアクセスを必要とするhttpWebRequestを使用していることを読みました。これは本当ですか?もしそうなら、なぜそれは文字通り、1回おきにそれにアクセスできるのですか?

電話をかける前に、次の行を追加してみました。

WebService service = new WebService();
HttpContext.Current = service.Context;

しかし、それは違いを生みません。

サービスを10回実行しました。結果は次のとおりです。

1:成功

2:例外:スレッドが中止されていました。スタックトレース:System.Net.ConnectStream.Read(Byte []バッファー、Int32オフセット、Int32サイズ)at System.Net.WebClient.DownloadBitsState.RetrieveBytes(Int32&bytesRetrieved)at System.Net.WebClient.DownloadBits(WebRequest request、Stream writeStream、CompletionDelegate completeDelegate、AsyncOperation asyncOp)at System.Net.WebClient.DownloadFile(Uri address、String fileName).. ..

3:成功

4:例外:スレッドが中止されていました。スタックトレース:System.Net.ConnectStream.Read(Byte []バッファー、Int32オフセット、Int32サイズ)at System.Net.WebClient.DownloadBitsState.RetrieveBytes(Int32&bytesRetrieved)at System.Net.WebClient.DownloadBits(WebRequest request、Stream writeStream、CompletionDelegate completeDelegate、AsyncOperation asyncOp)at System.Net.WebClient.DownloadFile(Uri address、String fileName).. ..

5:成功

6:例外:スレッドが中止されていました。スタックトレース:System.Net.WebClient.DownloadBitsState.SetResponse(WebResponse response)at System.Net.WebClient.DownloadBits(WebRequest request、Stream writeStream、CompletionDelegate completeDelegate、AsyncOperation asyncOp)at System.Net.WebClient.DownloadFile(URI address、文字列fileName)..。

7:成功

8:例外:スレッドが中止されていました。スタックトレース:System.Net.WebClient.DownloadBitsState.SetResponse(WebResponse response)at System.Net.WebClient.DownloadBits(WebRequest request、Stream writeStream、CompletionDelegate completeDelegate、AsyncOperation asyncOp)at System.Net.WebClient.DownloadFile(URI address、文字列fileName)..。

9:成功

10:例外:スレッドが中止されていました。スタックトレース:System.Net.WebClient.DownloadBitsState.SetResponse(WebResponse response)at System.Net.WebClient.DownloadBits(WebRequest request、Stream writeStream、CompletionDelegate completeDelegate、AsyncOperation asyncOp)at System.Net.WebClient.DownloadFile(URI address、文字列fileName)..。

これを機能させる方法はありますか?

編集:投稿コードに関する質問への回答:投稿するものはあまりありません。それはすべて非常に簡単です。

[WebService(Namespace = "http://nerdliness.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService()]
[System.ComponentModel.ToolboxItem(false)]      
public class FileProcessor : System.Web.Services.WebService
{

    [WebMethod]
    [SoapDocumentMethod(OneWay = true)]
    public void ParseFile(String urlOfFileToGrab, String destinationPath)
    {
          try
          {
               WebClient client = new WebClient();
               client.DownloadFile(urlOfFileToGrab, destinationPath);
               client.Dispose();
           }
           catch (Exception ex)
           {  
              //Log it
           }
    }
}
4

2 に答える 2

0

コードを表示しないと、Web サービス内で作成/消費しているリソースを適切に破棄していないように思えます。したがって、機能してからクラッシュし(すべてを破棄するスレッドを中止します)、再び機能します。

編集:

考えたり見たりする他のいくつかのこと。1)一方向バインディングを使用したことはありませんが、そのセットがない場合でも機能します。2) これらを呼び出すのが速すぎますか? つまり、メソッドを再度呼び出すまでにダウンロード/保存が完了していますか? 3) web.config で、タイムアウトと最大ダウンロード サイズが、ファイルのダウンロード/転送に十分な大きさに設定されていますか?

<system.web>
    <httpRuntime executionTimeout="600" maxRequestLength="2048000" />
</system.web>

それが役に立たない場合、おそらく他の誰かが以前にこの問題に遭遇した可能性があります。Googleによると、あなたは唯一のものです:)

于 2010-07-14T12:53:54.517 に答える
0

OK、大きな出来事があり、投稿する前に必要なほど徹底的に調査しなかったことをお詫びします (私これに 2 日間取り組んできましたが...) httpContext のことは長い野生のガチョウの追跡でした :(

私が上に投稿したコードは、私が実際に作業しているものの単純化されたバージョンです (ばかげています、私は知っています、申し訳ありません)。しかし、それは機能する単純化されたバージョンを試すように私に促しました!

私の問題は今です:

自分の (System.Web.Drawing ではない) ImageFile オブジェクトのリストを持つオブジェクトがあります。webClient を使用して新しいファイルをダウンロードする前に、まずオブジェクトから現在の ImageFile ファイルをすべて削除する呼び出しを行います。この呼び出しはリストをループし、ImageFile ごとに次の処理を行います。

 try
            {
                File.Delete(lowResFilePath);
                File.Delete(hiResFilePath);
            }
            catch (Exception ex0)
            { }

            try
            {
                if (Directory.GetFiles(hiResFilePath.Substring(0, hiResFilePath.LastIndexOf("\\"))).Length <= 0)
                    Directory.Delete(hiResFilePath.Substring(0, hiResFilePath.LastIndexOf("\\")));
            }
            catch (Exception ex0)
            { }

上記の方法を使用すると、元の投稿で述べたようにサービスがエラーになります。ただし、次の行をコメントアウトすると:

                //try
            //{
            //    if (Directory.GetFiles(hiResFilePath.Substring(0, hiResFilePath.LastIndexOf("\\"))).Length <= 0)
            //        Directory.Delete(hiResFilePath.Substring(0, hiResFilePath.LastIndexOf("\\")));
            //}
            //catch (Exception ex0)
            //{ }

すべて正常に動作します!!

これらの行は、削除したばかりのファイルの 1 つを含むフォルダーをチェックするだけです。そのフォルダが空になったら、削除したいと思います。

繰り返しますが、私自身の野生のガチョウの追跡であなたの素敵な人々を導いたことをお詫びします. しかし、なぜこれが起こっているのか、何か考えはありますか? または、空の場合、webclient行がthreadabortexceptionをスローせずに、ディレクトリを正常に削除するにはどうすればよいですか??

ありがとう :)

于 2010-07-14T14:04:31.230 に答える