2014-01-13 134 views
1

我正在使用ServiceStack Web服務來處理圖片上傳。用multipart/form-data上傳 - 無法檢索自託管服務中的文件

當在IIS通過AppHostBase承載這項服務的一切工作正常。

現在我已經轉向使用AppHostHttpListenerBase在控制檯應用中運行的自託管服務,並且突然間我無法再訪問上傳的數據。

我使用下面的屬性來獲取文件:

var uploadedFiles = base.Request.Files; 

當自託管的,該陣列的IHttpFile是空的。當在ISS中託管時,它包含上載。

POST http://localhost:8081/upload/aaa HTTP/1.1 
Accept: application/json 
Content-Type: multipart/form-data; boundary="607a4dcf-585a-483b-b7dd-9f30d902e4a8" 
Host: localhost:8081 
Content-Length: 69553 

--607a4dcf-585a-483b-b7dd-9f30d902e4a8 
Content-Type: application/octet-stream 
Content-Disposition: form-data; name=file; filename=file; filename*=utf-8''file 

**** IMAGE DATA **** 
--607a4dcf-585a-483b-b7dd-9f30d902e4a8-- 

我使用ServiceStack 4.0.5版從的NuGet:

客戶端發送與multipart/form-data一個Content-Type的請求,它看起來像這樣。主機項目正在運行.NET 4.5。

這是不應該工作時,自主或我必須配置的東西,使其工作?

+0

彼得,它應該工作。我剛剛在v4中設置了一個新項目,並且沒有任何問題看到這些文件。 [見這裏](https://gist.github.com/scottmcarthur/8399716)爲我的工作代碼。你可以發佈你的配置,所以我可以理解你做什麼不同嗎? – Scott

+1

@Scott感謝您的幫助。你的回答讓我走上正軌。似乎'HttpListener'對Content-Disposition標頭非常嚴格。 「文件名」的值必須用雙引號括起來才能起作用。當我添加那些我可以看到的文件。如果你添加一個答案,我會接受它。 –

+0

很高興你能工作。我已經添加了答案。 – Scott

回答

2

我已經測試了在新鮮的v4項目中使用ServiceStack上傳文件。

的Program.cs

using System; 
using ServiceStack; 

namespace Testv4 
{ 
    class MainClass 
    { 
     public static void Main() 
     { 
      var appHost = new AppHost(500); 
      appHost.Init(); 
      appHost.Start("http://*:8082/"); 
      Console.ReadKey(); 
     } 
    } 

    public class TestApp 
    { 
     [Route("/upload", "POST")] 
     public class UploadFileRequest {} 

     public class TestController : Service 
     { 
      public void Any(UploadFileRequest request) 
      { 
       Console.WriteLine(Request.Files.Length); 
      } 
     } 
    } 

    public class AppHost : AppHostHttpListenerPoolBase 
    { 
     public AppHost(int poolSize) : base("Test Service", poolSize, typeof(TestApp).Assembly) 
     { 
     } 

     public override void Configure(Funq.Container container) 
     { 
     } 
    } 
} 

的index.html

<!doctype html> 
<html> 
    <head> 
     <title>Test</title> 
    </head> 
    <body> 
    <form action="/upload" method="POST" enctype="multipart/form-data"> 
     <h1>Upload File</h1> 
     <input type="file" name="File1" /> 
     <input type="submit" value="Upload" /> 
    </form> 
    </body> 
</html> 

HttpListener要求Content-Disposition頭周圍的文件名

內容處置被引用:形狀數據; NAME = 「文件1」;文件名=「somefile.jpg」