2009-08-27 4 views
20

메시지 계약과 함께 WCF 스트리밍을 사용하려고합니다. 스트림 자체 옆에 추가 매개 변수가 필요하기 때문입니다.WCF : 메시지 계약을 사용하여 스트리밍 사용

기본적으로 파일 업로드 및 다운로드 서비스를 만들고 추가 로직을 맨 위에 표시합니다.

서버 오류 '/'응용 프로그램에 : 나는 모든 것이 잘 있는지 확인하기 위해 브라우저에서 서비스를 공격 할 때

불행하게도, 나는 다음과 같은 오류가 발생합니다. 작업 'UploadFile'계약에서 'IFileTransferService'는 SOAP 헤더가있는 MessageContract를 사용합니다. SOAP 헤더는 None MessageVersion에서 지원하지 않습니다.

불행히도 내게 도움이되는 중요한 결과를 얻지 못했습니다. 너희들이 나를 도울 수 있니? 여기 서비스의 세부 사항 (나는 공간 때문에 다운로드 부분을 제거했다).

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

UPDATE :

[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; 
} 

난은 BasicHttpBinding이 아닌 긍정적 인 효과와 바인딩 customhttp를 모두 사용하는 것을 시도했다 온라인 설명서를 읽기가 MessageContracts와 함께 스트리밍 참으로 할 수 있어야 것으로 보인다. MSDN (Large Data and Streaming)에 예를 들어, 참조 : 나는 또한 파일 업로드의 서비스를 달성하는 사람들의 블로그 게시물을 본 내가 (예를 here을 위해) 함께 넣어하려고 것과 매우 유사 다운로드 한

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; 
} 

.

UPDATE 2 난은 BasicHttpBinding과 서비스를 호스팅하는 작은 콘솔과 자기를 만드는 시도하고 거기에 마법처럼 작동합니다. 나는 그 문제가 IIS에서의 호스팅일지도 모른다고 생각하기 시작했다. 어떤 생각?

업데이트 3 내 대답보기

+0

몸체 요소가 하나뿐이므로'Order = 1'은'MessageBodyMember' 속성에서 중복되는 것 같습니다. –

답변

8

내가 마지막으로 오류가 무엇인지 발견 : 그것은 비누 버전과는 아무런 관련이없는, 스트림, 등 ... 난 그냥 내 자신의 서비스의 이름을 mispelled, FileTransfer 대신를 사용하는 (!) FileTransferService.

결국 basicHttpBinding은 완벽하게 괜찮 았기 때문에 맞춤 바인딩에 의존 할 필요가 없었습니다.

원본 (나쁜) 버전 :

<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> 

뉴 (고정) 버전 :

<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> 

아직도 내가 오류 메시지가 무슨 일이 있었는지 이해하기 위해 어떤 식 으로든 도움이되었다 말할 수 없다 여기에 ....

전체 서비스에 관심이 있다면 내 블로그에 대한 자세한 내용은 다음 링크를 참조하십시오. File Transfer with WCF

2

요청 및 응답 모두에서 스트리밍 (즉, 엄청난 양의 데이터 전송)이 필요합니까? 아니면 그냥 응답 (일반적으로 : 파일 또는 대형 데이터 세트 다운로드)?

당신이 응답에만 필요한 경우, 당신은 된 transferMode에 "StreamedResponse"설정하려고한다 :

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

은 "스트리밍"설정이 두 가지를 스트리밍 것이다 -로, 모두 요청이 서버로 이동을 물론 서버의 응답으로 스트리밍됩니다. 더 자주는 아니지만 이상적인 시나리오는 아닙니다.

마크

+0

안녕하세요, 제 질문에 언급했듯이, 파일 업로드와 다운로드를 모두 허용하는 파일 서비스를 만들고 있습니다. . 따라서 나는 두 가지 방법으로 스트리밍 할 수 있어야합니다. 내가 겪고있는 오류와 관련이 있다고 생각합니까? –

+0

잘 모르겠습니다 - 이전에 메일 계약과 스트리밍을 한 번도 본적이 없으며 서버에서 다운로드 한 것만으로 파일 다운로드가 가능하고 TransferMode를 StreamedResponse로 설정하면 도움이되는 경우를 보았습니다 –

+0

(메시지 계약 부분없이) DataContract 만 사용하면 작동합니다. –

0

'WCF Data Service'템플릿을 사용하여 'WCF Service'템플릿 대신 svc 파일을 생성 한 후에 오류가 발생했습니다. 문제가 해결 된 서비스 호스트 파일을 수정했습니다.