1

http リクエストをスレッドで処理したいのですが、次のコードでは、OutputStream (コードに記載されているように) を書き込むことができないという問題があります。このプロセスをメインスレッドに入れると、問題ありません。何かアドバイスをいただけますか?

    public partial class MainWindow : Window
    {
       private void Window_Loaded(object sender, RoutedEventArgs e)
       {
            var server = new HttpServer();
            try
            {
                server.EndPoint = new IPEndPoint(127.0.0.0, 80); //set webServer para
                server.Start(); //start webServer
                server.RequestReceived += server_RequestReceived; //register the event
            }
            catch (Exception ex)
            {
                return;
            }
       }
       private void server_RequestReceived(object sender, HttpRequestEventArgs e)
       {
           var dataProcess = new Action<HttpRequestEventArgs>(DataProcess);
           Dispatcher.BeginInvoke(dataProcess,e); //start thread
       }
       private void DataProcess(HttpRequestEventArgs e)
       {
           StreamReader sr = new StreamReader(@"c:\test.txt");
           string text = sr.ReadToEnd();
           using (var writer = new StreamWriter(e.Response.OutputStream)) //**Cannot write stream**
           {
               writer.Write(text);
           }
           sr.Close();
       }
    }
4

2 に答える 2

1

新しいスレッドが実行される前に、リクエストがクローズされていると思います。できることは、新しいスレッドでリクエスト全体を実行することです。何かのようなもの:

public partial class MainWindow : Window
{
   private void Window_Loaded(object sender, RoutedEventArgs e)
   {
        var start = new Action<HttpRequestEventArgs>(Start);
        Dispatcher.start(start,e); //start thread
   }

   private void Start(HttpRequestEventArgs e)
   {
        var server = new HttpServer();
        server.EndPoint = new IPEndPoint(127.0.0.0, 80); //set webServer para
        server.Start(); //start webServe
        server.RequestReceived += server_RequestReceived; //register the event
   }

   private void server_RequestReceived(object sender, HttpRequestEventArgs e)
   {
       StreamReader sr = new StreamReader(@"c:\test.txt");
       string text = sr.ReadToEnd();
       using (var writer = new StreamWriter(e.Response.OutputStream)) //**Cannot write stream**
       {
           writer.Write(text);
       }
       sr.Close();
   }
}
于 2012-05-15T04:28:02.383 に答える
0

ほとんどの場合e.Response.OutputStream、サーバーから受信した応答を含む書き込み専用ストリームです。

やりたいことに応じて、要求ストリームに書き込むか、OutputStream から読み取ることができます。

注: いくつかのカスタム クラスを使用しているため、提案は純粋にメソッド名に基づいています。

于 2012-05-15T04:36:23.753 に答える