2011-04-16 59 views
1

我有一个位于网页上的Silverlight应用程序。它允许用户将多个文档上传到服务器。当我开始上传一个文件到服务器,我会做出一个处理程序的调用一个POST请求,我把它块,如果该文件是太大用下面的代码:Silverlight从处理程序接收响应

private void UploadFileEx() 
{ 
    Status = FileUploadStatus.Uploading; 
    var temp = FileLength - BytesUploaded; 

    var ub = new UriBuilder(_urlServer); 
    var complete = temp <= ChunkSize; 

    ub.Query = string.Format("{3}locationCode={4}&filename={0}&StartByte={1}&Complete={2}", RockDocumentName, BytesUploaded, complete, 
           string.IsNullOrEmpty(ub.Query) ? string.Empty : string.Format("{0}&", ub.Query.Remove(0, 1)), _locationCode); 

    var webrequest = (HttpWebRequest) WebRequest.Create(ub.Uri); 
    webrequest.Method = "POST"; 

    // Begins an asynchronous request for a Stream object to use to write data. 
    // The asynchronous callback method uses the EndGetRequestStream method to return the actual stream. 
    // This means 
    webrequest.BeginGetRequestStream(WriteCallback, webrequest); 
} 

private void WriteCallback(IAsyncResult asynchronousResult) 
{ 
    var webrequest = (HttpWebRequest) asynchronousResult.AsyncState; 
    // End the operation. 
    // Here we obtain the stream to write the request 
    var requestStream = webrequest.EndGetRequestStream(asynchronousResult); 

    var buffer = new Byte[4096]; 
    int bytesRead; 
    var tempTotal = 0; 

    Stream fileStream = File.OpenRead(); 

    fileStream.Position = BytesUploaded; 
    while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0 && tempTotal + bytesRead < ChunkSize) 
    { 
     requestStream.Write(buffer, 0, bytesRead); 
     requestStream.Flush(); 
     BytesUploaded += bytesRead; 
     tempTotal += bytesRead; 

     if (UploadProgressChanged != null) 
     { 
      var percent = (int) ((BytesUploaded/(double) FileLength)*100); 
      var args = new UploadProgressChangedEventArgs(percent, bytesRead, BytesUploaded, FileLength, 
                  RockDocumentName); 
      Dispatcher.BeginInvoke(() => UploadProgressChanged(this, args)); 
     } 
    } 

    fileStream.Close(); 
    requestStream.Close(); 

    // Whenever the operation is ready call the ReadCallback method (when this method 
    // is called we know that the chunk of file has arrived successfully to the server, 
    // it's time to process the next chunk). 
    webrequest.BeginGetResponse(ReadCallback, webrequest); 
} 

我想我的处理程序返回我的文档名称(我为处理程序中的每个文档生成一个新文件名,因为我们有一个正在使用的文档命名标准)。所以,我编写我的AsyncCallback这样,我期待的AsyncState会回到我以为我settting在处理器头:

private void ReadCallback(IAsyncResult asynchronousResult) 
{ 
    var documentName = ((System.Net.BrowserHttpWebRequest)asynchronousResult.AsyncState).Headers["documentname"].ToString(); 

    if (BytesUploaded < FileLength) 
     UploadFileEx(); 
    else 
    { 
     Status = FileUploadStatus.Complete; 
    } 
} 

这里是我的处理程序:

public void ProcessRequest(HttpContext context) { 
     Context = context; 
     UploadFile(); 
     //context.Request.Headers.Add("documentname", "testfilename.pdf"); 
     context.Response.Headers.Add("documentname", "testfilename.pdf"); 
} 

这不是工作正如我原先想的那样。我究竟做错了什么?我是否在我的处理程序中设置了错误标题?我的处理程序是否有另一种方式与Silverlight客户端应用程序交谈?

任何帮助,将不胜感激。提前致谢!

回答

1

如果您的处理程序将文档名称作为Response主体的一部分而不是Header发回,您可能会有更多的运气。

试试这个代码,看看你会得到什么:

private void ReadCallback(IAsyncResult asynchronousResult) 
{ 
    var webRequest = (HttpWebRequest) asynchronousResult.AsyncState; 
    var webResponse = (HttpWebResponse) webRequest.EndGetResponse(asynchronousResult); 
    var reader = new StreamReader(webResponse.GetResponseStream()); 
    var documentName = reader.ReadToEnd(); 
    reader.Close(); 


    if (BytesUploaded < FileLength) 
     UploadFileEx(); 
    else 
    { 
     DocumentName = documentName; 
     Status = FileUploadStatus.Complete; 
    } 
} 

而在的ProcessRequest:

Context.Response.Write(“Document Name”); 
+0

感谢,这工作!从另一天把我的头靠在桌子上,挽救了我。 – Mark 2011-04-18 14:47:58

相关问题