2012-05-17 27 views
28

Thông tin cơ bản về vấn đề này.MVC3 HttpPostedFileBase Tải lên đầu tiên không cung cấp dữ liệu nhưng sau đó làm

CHỈNH SỬA 3 Tôi có thể xác minh rằng điều này có vẻ hoạt động trở lại trong Chrome 20. Cảm ơn!

TLDR Cập nhật

EDIT 2 Sau hơn nữa mucking về vấn đề này dường như là một lỗi trong Chrome 19. Xin vui lòng xem ở đây:

http://groups.google.com/a/chromium.org/group/chromium-bugs/browse_thread/thread/15bc4992bcd4be1d/b905e8de20ee58fa?lnk=raot

Không có gì giống như một lên đến lỗi phút! :-)

Firefox-mới nhất và IE8/9 hoạt động như mong đợi. Các bản ghi Fiddler cho thấy hành vi tương tự với sự khác biệt lớn mà kiểm tra ủy quyền 401 lần 2 không gửi tải trọng biểu mẫu bị cắt xén và nó hoạt động như mong đợi.

Có vẻ như trường hợp kiểm tra và bản sửa lỗi đang hoạt động! Vì vậy, hy vọng cho bất kỳ của bạn ra khỏi đó có thể đã chạy vào này, điều này sẽ giúp!

END TLDR

Tôi có một hành động điều khiển mà mất trong chỉ một tập tin được tải lên mà là một tập tin CSV của "sự kiện". Đằng sau hậu trường, CSV này được phân tích cú pháp, chuyển thành đối tượng Sự kiện và dữ liệu được đồng bộ hóa trong cơ sở dữ liệu. Kết quả là, người dùng được nhắc tải xuống bảng tính Excel chứa tất cả các lỗi trên mỗi dòng xảy ra.

Tất cả đều hoạt động tốt tại địa phương trên máy phát triển của tôi. Tuy nhiên, khi triển khai vào môi trường DEV, tôi sẽ nhận được các kết quả khác nhau. Nỗ lực đầu tiên để tải lên kết quả tệp trong luồng là, từ nào tôi đang tìm kiếm ở đây, không thể đọc được? Nó báo cáo chính xác độ dài của nó nhưng cố gắng để kéo thông tin ra không có gì. Lần đọc tiếp theo có dữ liệu và mọi thứ hoạt động như mong đợi.

Tôi sẽ cung cấp cho bạn các mã mã thích hợp. Thứ nhất, hình thức HTML gen'd đơn giản:

<form action="/Events/ImportLocal" enctype="multipart/form-data" method="post"> 

<input id="uploadFile" name="uploadFile" type="file" /> 
<input type="submit" value="Upload Events" />  

</form> 

Khá thẳng về phía trước:

điều khiển hành động (tha thứ cho sự lộn xộn, tôi đã hack ở này cho một vài giờ bây giờ):

[HttpPost] 
public ActionResult ImportLocal(HttpPostedFileBase uploadFile) 
{ 
    if (uploadFile == null || uploadFile.ContentLength <= 0) 
    { 
     BaseLogger.Info("uploadFile is null or content length is zero..."); 
     //Error content returned to user 
    } 

    BaseLogger.InfoFormat("Community Import File Information: Content Length: {0}, Content Type: {1}, File Name: {2}", 
    uploadFile.ContentLength, uploadFile.ContentType, uploadFile.FileName); 

//This logger line is always reporting as correct. Even on the attempts where I can't pull out the stream data, I'm seeing valid values here. 
//EXAMPLE output on failed attempts: 
//Import File Information: Content Length: 315293, Content Type: application/vnd.ms-excel, File Name: Export_4-30-2012.csv 

    BaseLogger.InfoFormat("Upload File Input Stream Length: {0}", uploadFile.InputStream.Length);   
//This is reporting the correct length on failed attempts as well 


//I know the below is overly complicated and convoluted but I'm at a loss for why the inputstream in HttpPostedFileBase is not pulling out as expected 
//so I've been testing 
     var target = new MemoryStream(); 
     uploadFile.InputStream.CopyTo(target); 
     byte[] data = target.ToArray(); 
     BaseLogger.InfoFormat("File stream resulting length = {0}", data.Length); 
//This reports correctly. So far so good. 

     StringReader stringOut; 
     var stream = new MemoryStream(data) {Position = 0}; 

     using (var reader = new StreamReader(stream)) 
     { 
      string output = reader.ReadToEnd(); 
      BaseLogger.InfoFormat("Byte[] converted to string = {0}", output); 
//No go...output is reported to be empty at this point so no data ever gets sent on to the service call below 
      stringOut = new StringReader(output); 
     } 


     //Build up a collection of CommunityEvent objects from the CSV file 
     ImportActionResult<Event> importActionResults = _eventImportServices.Import(stringOut); 

Mục tiêu là chuyển một trình đọc văn bản hoặc trình xâu chuỗi vào phương thức dịch vụ như sau hậu trường, điều này đang sử dụng triển khai xử lý CSV muốn có các loại này.

Bất kỳ ý tưởng nào tại sao yêu cầu đầu tiên không thành công nhưng công việc tiếp theo? Tôi cảm thấy tôi cần một bộ mắt mới khi tôi đang chạy khô trên ý tưởng.

Điểm cuối cùng, IIS 7.5 là mục tiêu cả cục bộ qua IIS Express và trên máy chủ đích.

Cảm ơn

EDIT cho bounty:

tôi sao chép thông điệp tiền thưởng của tôi ở đây và đầu ra Fiddler cho mỗi yêu cầu

Tôi đã thêm một vài ý kiến ​​cho câu hỏi này. Vấn đề xuất hiện liên quan đến NTLM. Những gì tôi thấy trong Fiddler là 401 trái phép theo yêu cầu 1 với dữ liệu biểu mẫu hợp lệ (điểm, đó là sự hiểu biết của tôi rằng hai yêu cầu 401 trái phép đầu tiên này là "bình thường" trong các trường hợp chỉ xác thực Windows được bật; Yêu cầu 2 được liệt kê lại là 401 với cùng dữ liệu biểu mẫu, ngoại trừ dữ liệu tệp đã tải lên hiện chỉ là một loạt các hộp, cùng một kích thước dữ liệu chính xác, không phải dữ liệu được tải lên chính xác. Yêu cầu 3 là 200 OK chứa dữ liệu bị cắt xén và đây là hành động của bộ điều khiển của tôi. Làm thế nào để NTLM có thể chơi tốt với các tệp tải lên?

Dưới đây là đầu ra Fiddler cho mỗi yêu cầu:

Yêu cầu 1) enter image description here

Yêu cầu 2) enter image description here

Và cuối cùng yêu cầu 3 đó là HTTP xử lý 200 OK enter image description here

EDIT 2 Sau hơn nữa mucking về vấn đề này dường như là một lỗi trong Chrome 19. Xin vui lòng xem ở đây:

http://groups.google.com/a/chromium.org/group/chromium-bugs/browse_thread/thread/15bc4992bcd4be1d/b905e8de20ee58fa?lnk=raot

Không có gì giống như một lên đến lỗi phút! :-)

Firefox-mới nhất và IE8/9 hoạt động như mong đợi. Các bản ghi Fiddler cho thấy hành vi tương tự với sự khác biệt lớn mà kiểm tra ủy quyền 401 lần 2 không gửi tải trọng biểu mẫu bị cắt xén và nó hoạt động như mong đợi.

Có vẻ như trường hợp kiểm tra và bản sửa lỗi đang hoạt động! Vì vậy, hy vọng cho bất kỳ của bạn ra khỏi đó có thể đã chạy vào này, điều này sẽ giúp!

Cảm ơn

+0

Như một người theo dõi, điều này dường như liên quan đến việc sử dụng xác thực Windows nghiêm ngặt. Xác thực Windows đang bật và Ẩn danh đang tắt trên trang web. Sau khi kích hoạt Fiddler tôi thấy tiêu chuẩn 2 thất bại 401 ủy quyền các yêu cầu với NTLM. Đây là nơi xảy ra sự cố. Vào lần đầu tiên thất bại 401 ủy quyền yêu cầu, tôi thấy biểu mẫu được đăng với dữ liệu tải lên tệp thích hợp. Tuy nhiên, vào lần thứ hai không thành công, 401 ủy quyền yêu cầu, dữ liệu biểu mẫu bị cắt xén. Đó là kích thước phù hợp nhưng không phải là dữ liệu chính xác. Tôi nhận được 309KB (hoặc bất kỳ kích thước nào) hoặc các ký tự NUL khi xem đầu ra trong notepad ++ – Khepri

+0

Tiếp theo: Chúng tôi có nhiều cấp ủy quyền trong ứng dụng dựa trên danh tính của người dùng để thay đổi ứng dụng để chạy trong tài khoản dịch vụ sẽ nhận được tôi bởi đây không phải là một lựa chọn, hoặc ít nhất tôi không tin như vậy. Có cách nào để không phải mạo danh và sử dụng tài khoản dịch vụ để cho phép tải lên thành công không? – Khepri

+1

+1 cho câu hỏi được ghi nhận rõ ràng và để cập nhật mọi thứ. –

Trả lời

1

Đây chỉ là một ý tưởng để thử. Lưu ý rằng StreamReader có nhiều nhà xây dựng:

http://msdn.microsoft.com/en-us/library/system.io.streamreader.aspx

Trong một số các nhà xây dựng nó cố gắng để autodetect mã hóa (nếu được chỉ định) và nếu nó không thể phát hiện nó sau đó nó rơi trở lại vào một quy định. Hàm tạo sử dụng mã hóa UTF-8. Bạn có thể thay đổi hàm tạo để tự động phát hiện mã hóa và nếu không thì hãy sử dụng UTF-8.

1

Tôi nghĩ rằng bạn cần kiểm tra quyền trên thư mục IIS/Trang Web ảo trong đó các tệp được tải lên và bản thân nó nếu chúng ở một nơi khác biệt.

1

Câu hỏi hay. Xác thực là điều đầu tiên tôi nghĩ đến. Nó là bình thường để có được hai trái phép và được ủy quyền thứ 3. Đây chỉ là cách NTLM hoạt động.

Nếu cần làm cho Chrome hoạt động trên Chrome và không thể đợi khắc phục, tôi khuyên bạn nên bật xác thực Mẫu chuyển hướng đến cùng một miền nhưng trên một cổng khác, nơi ứng dụng LOGIN có xác thực cửa sổ. Ứng dụng này đặt cookie biểu mẫu hoặc không và gửi lại cho bạn ứng dụng chính. Quá trình này cũng được mô tả ở đây: http://msdn.microsoft.com/en-us/library/ms972958.aspx

Bằng cách này, NTLM của bạn được thực hiện một lần và sau đó bạn có cookie, vì vậy NTLM không được sử dụng với yêu cầu POST của bạn và mọi thứ sẽ hoạt động như mong đợi.

Chỉ cần nghĩ rằng tôi sẽ chia sẻ cái này :)

Các vấn đề liên quan