2008-11-27 36 views
12

Tôi đang sử dụng WCF và muốn tải lên một tệp lớn từ máy khách đến máy chủ. Tôi đã điều tra và quyết định làm theo cách tiếp cận chunking nêu tại http://msdn.microsoft.com/en-us/library/aa717050.aspxWCF Chunking/Streaming

Tuy nhiên, phương pháp này (giống như luồng) hạn chế hợp đồng signitures phương pháp hạn chế:

[OperationContract(IsOneWay=true)] 
[ChunkingBehavior(ChunkingAppliesTo.InMessage)] 
void UploadStream(Stream stream); 

Các mẫu sử dụng ví dụ khá thuận lợi của tải lên một tệp từ một đường dẫn cố định và lưu nó vào một đường dẫn cố định trên máy chủ. Do đó, câu hỏi của tôi là làm cách nào để chuyển các tham số bổ sung để chỉ định những thứ như tên tệp, filepath, v.v.

ví dụ: Tôi muốn một cái gì đó như:

[OperationContract(IsOneWay=true)] 
[ChunkingBehavior(ChunkingAppliesTo.InMessage)] 
void UploadStream(Stream stream, String filePath); 

Cảm ơn trước, Đánh dấu.

Trả lời

3

Bạn có thể thực hiện phiên dịch vụ của mình và có phương pháp khởi tạo trong hợp đồng với thuộc tính Bắt đầu được đặt thành true. Một cái gì đó như:

[OperationContract(IsInitiating = true)] 
void InitializeUploadService(string filename); 

[OperationContract(IsOneWay = true, IsInitiating = false)] 
[ChunkingBehavior(ChunkingAppliesTo.InMessage)] 
void UploadStream(Stream stream); 

Tôi chưa bao giờ thử nó với các dịch vụ truyền trực tuyến nhưng về cơ bản nên WCF thực thi rằng InitializeUploadService luôn được gọi trước khi UploadStream.

Nhiều tài liệu có thể được tìm thấy ở đây: http://msdn.microsoft.com/en-us/library/system.servicemodel.description.operationdescription.isinitiating.aspx

13

This article giải thích làm thế nào để sử dụng thuộc tính MessageHeader để buộc mọi thứ phải được thông qua trong tiêu đề, và do đó không được tính là một tham số. Vì vậy, thay vì truyền một luồng và dữ liệu meta khác, hãy tạo một lớp có thuộc tính MessageContract và đánh dấu tất cả dữ liệu meta là một MessageHeader. Sau đó, đánh dấu luồng là MessageBodyMember (bài viết không chính xác gọi là "MessageBody"). Có phương pháp UploadStream của bạn lấy một tham số duy nhất có kiểu là lớp MessageContract mà bạn vừa tạo. Tôi đã làm điều này thành công, nhưng tôi đã không thực hiện nó song song với chunking. Chúc may mắn.

1

tôi sẽ xem xét MessageContracts và thêm những giá trị như tiêu đề thư để đối tượng của bạn. Điều này sẽ cho phép bạn chuyển luồng và bất kỳ giá trị nào có liên quan đến luồng dưới dạng tiêu đề thư.