c# WCF:메시지 계약을 사용하여 스트리밍 사용



.net wcf-binding (3)

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

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

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

불행히도 브라우저에서 서비스를 시작하여 모든 것이 정상적으로 작동하는지 확인하려고하면 다음과 같은 오류가 발생합니다.

'/'응용 프로그램의 서버 오류입니다. 계약의 'UploadFile'작업 'IFileTransferService'는 SOAP 헤더가있는 MessageContract를 사용합니다. SOAP 헤더는 None MessageVersion에서 지원하지 않습니다.

불행히도 인터넷 검색은 나를 도운 중요한 결과를 가져 오지 않았습니다. 너희들이 나를 도울 수 있니? 여기 서비스의 세부 사항 (나는 공간 때문에 다운로드 부분을 제거했다).

[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 바인딩을 모두 사용하려고 시도했다.

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

업데이트 : MessageContracts로 스트리밍하는 것이 가능할 것으로 보이는 온라인 설명서를 읽는 것. 예를 들어 MSDN ( 대형 데이터 및 스트리밍 )을 참조하십시오.

스트리밍 전송을위한 프로그래밍 모델

스트리밍을위한 프로그래밍 모델은 간단합니다. 스트리밍 된 데이터를 수신하려면 단일 스트림 입력 매개 변수가있는 작업 계약을 지정하십시오. 스트리밍 된 데이터를 반환하려면 Stream 참조를 반환합니다. [...]이 규칙은 메시지 계약에도 유사하게 적용됩니다. 다음 메시지 계약에 표시된 것처럼 메시지 계약에서 스트림이라는 단일 본문 멤버 만 가질 수 있습니다. 추가 정보를 스트림과 통신하려면이 정보가 메시지 헤더에 포함되어야합니다. 메시지 본문은 스트림 내용에 대해 독점적으로 예약됩니다.

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

나는 또한 파일 업로드 및 다운로드와 같은 서비스를 수행하는 사람들로부터 블로그 게시물을 보았습니다 (예를 들어 here ).

업데이트 2 나는 작은 콘솔과 basicHttpBinding으로 서비스를 호스팅하는 자체를 만들려고 노력하고 거기에 매력처럼 작동합니다. 나는 그 문제가 IIS에서의 호스팅일지도 모른다고 생각하기 시작했다. 어떤 생각?

업데이트 3 내 대답보기.


Answer #1

마침내 오류가 무엇인지 알아 냈습니다. 그것은 Soap 버전, 스트림 등과 아무 관련이 없습니다 ... 나는 FileTransfer 대신 FileTransfer 를 사용하여 내 서비스 이름 (!)을 FileTransfer 것입니다.

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

아직도 나는 오류 메시지가 어떤 일이 일어나고 있는지 이해하는 데 도움이되었다고 말할 수 없다.

전체 서비스에 관심이 있다면 다음 링크에서 내 블로그에 대한 자세한 내용을 확인할 수 있습니다. WCF로 파일 전송


Answer #2

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

응답에만 필요한 경우 Transfermode를 "StreamedResponse"로 설정해야합니다.

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

'스트리밍'설정은 두 가지 방법으로 스트리밍됩니다. 서버로 전송되는 요청은 물론 서버의 응답도 스트리밍됩니다. 더 자주는 아니지만 이상적인 시나리오는 아닙니다.

마크





wcf-configuration