2009-08-27 29 views
20

Tôi đang cố gắng sử dụng WCF truyền trực tuyến với các Hợp đồng Tin nhắn, bởi vì tôi cần các thông số bổ sung bên cạnh luồng chính nó.WCF: sử dụng phát trực tuyến với các Hợp đồng Tin nhắn

Về cơ bản tôi đang tạo dịch vụ tải lên và tải xuống tệp, với một số logic bổ sung ở trên cùng.

Thật không may, khi tôi cố gắng để đạt các dịch vụ từ trình duyệt để kiểm tra rằng mọi thứ đều ổn, tôi nhận được lỗi sau:

Server Error in '/' Application. Thao tác 'UploadFile' trong hợp đồng 'IFileTransferService' sử dụng MessageContract có tiêu đề SOAP. Các tiêu đề SOAP không được hỗ trợ bởi None MessageVersion.

Thật không may vì nó không mang lại kết quả đáng kể nào đã giúp tôi. Các bạn có thể giúp tôi không? Đây là chi tiết của dịch vụ (Tôi đã xóa phần tải xuống vì lý do không gian).

[ServiceContract(Namespace = "http://www.acme.org/2009/04")] 
public interface IFileTransferService 
{ 
    [OperationContract(Action = "UploadFile")] 
    void UploadFile(FileUploadMessage request); 
} 

[MessageContract] 
public class FileUploadMessage 
{ 
    [MessageHeader(MustUnderstand = true)] 
    public FileMetaData Metadata { get; set; } 

    [MessageBodyMember(Order = 1)] 
    public Stream FileByteStream { get; set; } 
} 

[DataContract(Namespace = "http://schemas.acme.org/2009/04")] 
public class FileMetaData 
{ 
    [DataMember(Name="FileType", Order=0, IsRequired=true)] 
    public FileTypeEnum fileType; 

    [DataMember(Name="localFilename", Order=1, IsRequired=false)] 
    public string localFileName; 

    [DataMember(Name = "remoteFilename", Order = 2, IsRequired = false)] 
    public string remoteFileName; 
} 

tôi đã cố gắng sử dụng cả hai basicHttpBinding và customhttp ràng buộc với không tác động tích cực:

<customBinding> 
    <binding name="customHttpBindingStream"> 
     <textMessageEncoding messageVersion="Soap12" /> 
     <httpTransport transferMode="Streamed" maxReceivedMessageSize="2147483647"/> 
    </binding> 
</customBinding> 

CẬP NHẬT: đọc tài liệu trực tuyến có vẻ như streaming với MessageContracts thực sự nên có thể. Tham khảo ví dụ để MSDN (Large Data and Streaming):

Programming Model for Streamed Transfers

The programming model for streaming is straightforward. For receiving streamed data, specify an operation contract that has a single Stream typed input parameter. For returning streamed data, return a Stream reference. [...] This rule similarly applies to message contracts. As shown in the following message contract, you can have only a single body member in your message contract that is a stream. If you want to communicate additional information with the stream, this information must be a carried in message headers. The message body is exclusively reserved for the stream content.

[MessageContract] 
public class UploadStreamMessage 
{ 
    [MessageHeader] 
    public string appRef; 
    [MessageBodyMember] 
    public Stream data; 
} 

Tôi cũng đã nhìn thấy bài đăng trên blog từ những người dịch vụ của tập tin tải lên hoàn thành và tải rất giống với những gì tôi đang cố gắng để đặt lại với nhau (ví dụ here).

CẬP NHẬT 2 Tôi đã thử tạo một bảng điều khiển nhỏ và tự lưu trữ dịch vụ bằng basicHttpBinding và ở đó nó hoạt động như một nét duyên dáng. Tôi bắt đầu tin rằng vấn đề có thể là lưu trữ trên IIS. Bất kỳ ý tưởng?

CẬP NHẬT 3 Xem câu trả lời của riêng tôi.

+0

Tôi tin rằng 'Order = 1' là thừa trong thuộc tính' MessageBodyMember' vì bạn chỉ có một phần tử cơ thể –

Trả lời

8

cuối cùng tôi phát hiện ra lỗi là gì: nó không có gì để làm với các phiên bản Xà phòng, suối, vv ... Tôi chỉ cần gõ sai tên của dịch vụ của riêng tôi, sử dụng FileTransfer thay vì (!) FileTransferService.

Cuối cùng cơ bảnHttpBinding hoàn toàn ổn, tôi không cần phải sử dụng một ràng buộc tùy chỉnh.

gốc (xấu) phiên bản:

<service 
    behaviorConfiguration="serviceBehavior" 
    name="Acme.Service.FileTransfer"> 
    <endpoint address="" 
     name="basicHttpStream" 
     binding="basicHttpBinding" 
     bindingConfiguration="httpLargeMessageStream" 
     contract="Acme.Service.IFileTransferService" /> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
</service> 

mới (cố định) phiên bản:

<service 
    behaviorConfiguration="serviceBehavior" 
    name="Acme.Service.FileTransferService"> 
    <endpoint address="" 
     name="basicHttpStream" 
     binding="basicHttpBinding" 
     bindingConfiguration="httpLargeMessageStream" 
     contract="Acme.Service.IFileTransferService" /> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
</service> 

Tôi vẫn không thể nói rằng các thông báo lỗi là hữu ích trong bất kỳ cách nào để hiểu những gì đang diễn ra trên đây ....

Nếu bạn quan tâm đến toàn bộ dịch vụ, bạn có thể tìm thêm chi tiết trên blog của mình tại liên kết sau: File Transfer with WCF

2

Bạn có cần truyền trực tuyến (tức là chuyển số lượng dữ liệu khổng lồ) cả về yêu cầu và phản hồi không? Hoặc chỉ trên phản hồi (thông thường: tải xuống tệp hoặc tập dữ liệu lớn)?

Nếu bạn chỉ cần vào phản ứng, bạn nên cố gắng thiết lập các transfermode để "StreamedResponse":

<customBinding> 
    <binding name="customHttpBindingStream"> 
     <textMessageEncoding messageVersion="Soap12" /> 
     <httpTransport transferMode="StreamedResponse" 
         maxReceivedMessageSize="2147483647"/> 
    </binding> 
</customBinding> 

Các "Truyền" thiết lập sẽ truyền cả hai cách - cả yêu cầu đi đến máy chủ, như cũng như phản hồi từ máy chủ, sẽ được phát trực tuyến. Thường xuyên hơn không, đó không phải là kịch bản lý tưởng.

Marc

+0

Xin chào Marc, như tôi đã đề cập trong câu hỏi của mình, tôi đang tạo một dịch vụ tệp cho phép tải lên và tải xuống tệp . Do đó tôi cần có khả năng truyền theo cả hai cách. Bạn có nghĩ rằng điều này có liên quan đến lỗi mà tôi đang gặp phải không? –

+0

Không chắc chắn - Tôi chưa bao giờ thấy sự kết hợp của phát trực tuyến với các hợp đồng Tin nhắn trước ..... và tôi đã thấy các trường hợp chỉ tải xuống từ máy chủ lớn (tải xuống tệp) và đặt TransferMode thành StreamedResponse đã giúp –

+0

nó hoạt động nếu bạn chỉ sử dụng DataContract (không có phần Message Contract) - chỉ để xem, để kiểm tra –

0

Tôi gặp lỗi sau khi sử dụng mẫu 'WCF Data Service' để tạo tệp svc thay vì mẫu 'WCF Service'. Sửa chữa tệp lưu trữ dịch vụ mà vấn đề đã được giải quyết.

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