2009-05-13 31 views
8

Chúng tôi đang tạo một dịch vụ WCF cần từ 2-4 tệp hình ảnh (nhỏ khoảng 2k-5k mỗi tệp) được gửi đến làm tham số đầu vào, cũng như khoảng 6 tham số trường văn bản. Dữ liệu được gửi trở lại đơn giản bao gồm một vài giá trị văn bản.Cách tốt nhất để gửi nhiều tệp đến dịch vụ WCF là gì?

Tôi hiểu một tệp có thể được gửi dưới dạng luồng nhưng không chắc chắn cách gửi nhiều tệp.

Khách hàng trong trường hợp này sẽ là bên thứ 3, mà chúng tôi muốn giao tiếp với dịch vụ WCF của chúng tôi càng đơn giản càng tốt.

Trả lời

24

Có thể có rất nhiều cách để thực hiện việc này, nhưng đây là suy nghĩ của tôi. Xin lưu ý rằng tôi chỉ đưa vào một số chuỗi tùy ý, bạn có thể thêm/xóa khi cần.

Trước tiên, bạn sẽ muốn một số loại đối tượng "đầu vào" sẽ được chuyển tới dịch vụ WCF chứa hình ảnh và giá trị chuỗi của bạn. Lưu ý thuộc tính Images là một mảng các mảng byte; điều này là để bạn có thể bao gồm nhiều hình ảnh.

[DataContract] 
public class InputObject 
{ 
    [DataMember] 
    public byte[][] Images { get; set; } 

    [DataMember] 
    public string FirstValue { get; set; } 

    [DataMember] 
    public string SecondValue { get; set; } 
} 

Tiếp theo, bạn sẽ muốn một đối tượng mà dịch vụ WCF của bạn sẽ trở lại ...

[DataContract] 
public class ReturnObject 
{ 
    [DataMember] 
    public string FirstValue { get; set; } 

    [DataMember] 
    public string SecondValue { get; set; } 
} 

ServiceContract của bạn sẽ trông như thế này.

[ServiceContract] 
public interface IService1 
{ 
    [OperationContract] 
    ReturnObject UploadData (InputObject input); 
} 

Và lớp dịch vụ của bạn như thế này.

public class Service1 : IService1 
{ 
    public ReturnObject UploadData (InputObject input) 
    { 
     // Do your thing with InputObject data 

     ReturnObject returnObject = new ReturnObject 
             { 
              FirstValue = "MyFirstValue" , 
              SecondValue = "MySecondValue" 
             }; 

     return returnObject; 
    } 
} 

Bạn cần đảm bảo ràng buộc dịch vụ phù hợp để gửi dữ liệu hình ảnh để tăng một số giới hạn mặc định là phù hợp. Đây là một ví dụ ràng buộc từ cấu hình dịch vụ của tôi.

<wsHttpBinding> 
    <binding name="Service1Binding" maxReceivedMessageSize="1000000"> 
    <readerQuotas maxArrayLength="1000000" 
        maxBytesPerRead="1000000" 
        maxDepth="1000000" 
        maxNameTableCharCount="1000000" 
        maxStringContentLength="1000000"/> 
    </binding> 
</wsHttpBinding> 

Đảm bảo bạn chỉ định điều này làm ràng buộcĐịnh cấu hình cho dịch vụ của bạn.

<endpoint address="" 
      binding="wsHttpBinding" 
      contract="WcfService5.IService1" 
      bindingConfiguration="Service1Binding"> 

Bây giờ tất cả những gì bạn cần làm là tham khảo điều này từ dịch vụ của khách hàng và gọi nó.

var images = new byte[2][]; 
images[0] = System.IO.File.ReadAllBytes(@"D:\Development\TestImage.bmp"); 
images[1] = System.IO.File.ReadAllBytes(@"D:\Development\TestImage.jpg"); 

var input = new InputObject 
       { 
        Images = images , 
        FirstValue = "MyFirstValue" , 
        SecondValue = "MySecondValue" 
       }; 

var client = new Service1Client(); 
client.UploadData(input); 

Hy vọng điều này sẽ giúp bạn ra ...

+0

Một rất chi tiết và dễ dàng để làm theo ví dụ. Điều này đã làm điều đó cho bạn NagaMensch? Nếu vậy tôi nghĩ nó xứng đáng được chấp nhận, phải không? –

+0

NagaMensch, điều này có trả lời câu hỏi của bạn không? –

+0

Vâng, điều này rất hữu ích! Tôi đã kết thúc bằng cách sử dụng một biến thể của điều này, đó là một bộ sưu tập của Byte []. – alchemical

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