2009-08-30 21 views
26

Có ai biết, hoặc tốt hơn là có một ví dụ về dịch vụ WCF chấp nhận một hình thức được mã hóa multipart/form-data tức là. một tập tin tải lên từ một trang web?Dịch vụ WCF để chấp nhận một dữ liệu đa dạng/hình thức được mã hóa sau

Tôi đã bỏ trống trên google.

Tạ, Ant

+0

Xem câu trả lời của tôi tại đây: http://stackoverflow.com/a/21689347/67824 –

+0

Liên kết này có tác dụng với tôi, tôi hy vọng bạn sẽ nhận được một số ý tưởng từ nó. http://stackoverflow.com/questions/7460088/reading-file-input-from-a-multipart-form-data-post/14514351#14514351 –

Trả lời

57

Vì vậy, ở đây đi ...

Tạo hợp đồng dịch vụ của bạn mà một hoạt động mà chấp nhận một dòng cho tham số duy nhất của nó, trang trí với WebInvoke như sau

[ServiceContract] 
public interface IService1 { 

    [OperationContract] 
    [WebInvoke(
     Method = "POST", 
     BodyStyle = WebMessageBodyStyle.Bare, 
     UriTemplate = "/Upload")] 
    void Upload(Stream data); 

} 

Tạo lớp ...

public class Service1 : IService1 { 

    public void Upload(Stream data) { 

     // Get header info from WebOperationContext.Current.IncomingRequest.Headers 
     // open and decode the multipart data, save to the desired place 
    } 

Và cấu hình, để chấp nhận luồng dữ liệu và kích thước tối đa

<system.serviceModel> 
    <bindings> 
    <webHttpBinding> 
     <binding name="WebConfiguration" 
       maxBufferSize="65536" 
       maxReceivedMessageSize="2000000000" 
       transferMode="Streamed"> 
     </binding> 
    </webHttpBinding> 
    </bindings> 
    <behaviors> 
    <endpointBehaviors> 
     <behavior name="WebBehavior"> 
     <webHttp />   
     </behavior> 
    </endpointBehaviors> 
    <serviceBehaviors> 
     <behavior name="Sandbox.WCFUpload.Web.Service1Behavior"> 
     <serviceMetadata httpGetEnabled="true" httpGetUrl="" /> 
     <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 
    <services>  
    <service name="Sandbox.WCFUpload.Web.Service1" behaviorConfiguration="Sandbox.WCFUpload.Web.Service1Behavior"> 
     <endpoint 
     address="" 
     binding="webHttpBinding" 
     behaviorConfiguration="WebBehavior" 
     bindingConfiguration="WebConfiguration" 
     contract="Sandbox.WCFUpload.Web.IService1" /> 
    </service> 
    </services> 
</system.serviceModel> 

Cũng trong System.Web tăng số lượng dữ liệu được cho phép trong System.Web

<system.web> 
     <otherStuff>...</otherStuff> 
     <httpRuntime maxRequestLength="2000000"/> 
</system.web> 

Đây chỉ là những điều cơ bản, nhưng cho phép việc bổ sung một Progress để hiển thị thanh tiến trình ajax và bạn có thể muốn thêm một số bảo mật.

+2

Làm thế nào để loại bỏ tất cả các rác đó đang được gửi trong với Stream như: Nội dung-Bố trí :, Content-Type: vv ... Tôi đang cố gắng để có được điều này để làm việc cho hình ảnh. Ngoài ra tại sao không thể có bất kỳ tham số khác được trong định nghĩa hợp đồng – Adam

+0

bất kỳ ý tưởng làm thế nào để có được công việc này với xà phòng ??? – Gluip

1

Tôi không biết chính xác những gì bạn đang cố gắng để hoàn thành ở đây, nhưng không có built-in hỗ trợ trong "cổ điển" WCF dựa trên SOAP để nắm bắt và xử lý hình thức bài dữ liệu. Bạn sẽ phải tự mình làm điều đó.

Mặt khác, nếu bạn đang nói về WCF dựa trên REST với webHttpBinding, bạn chắc chắn có một phương thức dịch vụ được trang trí với thuộc tính [WebInvoke()] sẽ được gọi bằng phương thức HTTP POST .

[WebInvoke(Method="POST", UriTemplate="....")] 
    public string PostHandler(int value) 

Mẫu URI sẽ xác định URI sẽ sử dụng nơi POST HTTP nên đi. Bạn sẽ phải móc lên đến hình thức ASP.NET của bạn (hoặc bất cứ điều gì bạn đang sử dụng để thực sự làm bài).

Để biết giới thiệu tuyệt vời về WCF kiểu REST, hãy xem screen cast series của Aaron Skonnard trên Bộ khởi động REST WCF và cách sử dụng nó.

Marc

+1

Xin chào Marc, Tôi muốn có một dịch vụ wcf an toàn có thể chấp nhận dữ liệu đã đăng từ biểu mẫu html có [input type = file /] trong đó. Tôi đã có thể đăng biểu mẫu mà không cần tệp. Tôi không muốn ứng dụng khách chỉ là trình duyệt nên tôi không thể chuyển đổi tệp thành luồng byte, nó sẽ là bài đăng http/đa dữ liệu dạng số/ –

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