2011-09-06 3 views
1

MessageContract를 사용하지 않고 파일을 업로드 할 수있는 WCF 서비스가 있습니다.WebHttpBinding을 사용하는 WCF 서비스에 대한 'app.config'정의

[OperationContract, WebInvoke(UriTemplate = "UploadFile?filename={filename}")] 
bool UploadFile(string filename, Stream fileContents); 

Stream 개체 옆에 다른 매개 변수를 사용할 수 있습니다.이 개체는 UriTemplate의 일부이기 때문에 사용할 수 있습니다. 서비스가 Managed Windows Service로 실행되므로 ServiceHost를 수동으로 시작해야합니다.

protected override void OnStart(string[] args) 
{ 
    FileServiceHost = new ServiceHost(typeof(FileService), new Uri("http://" + Environment.MachineName + ":8000/FileService")); 
    FileServiceHost.AddServiceEndpoint(typeof(IFile), new WebHttpBinding(), "").Behaviors.Add(new WebHttpBehavior()); 
    FileServiceHost.Open(); 
} 

이 모든 것이 서비스가 시작되어 제대로 작동합니다. 그러나 위의 일부를 app.config 파일로 옮기고 싶었습니다. 이렇게하려면 두 번째 줄 OnStart을 주석 처리하고 첫 줄을 FileServiceHost = new ServiceHost(typeof(FileService))으로 바꿨습니다. 그럼 난이 app.config에 해당 정보를 ... 추가

갑자기 서비스가 더 이상 시작할 수 없습니다

<system.serviceModel> 

<services> 
    <service name="Test.Server.FileService" behaviorConfiguration="DefaultBehavior"> 
    <host> 
     <baseAddresses> 
     <add baseAddress="net.tcp://localhost:8000/FileService"/> 
     </baseAddresses> 
    </host> 
    <endpoint address="" binding="webHttpBinding" contract="IFile"/> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
    </service> 
</services> 

<behaviors> 
    <serviceBehaviors> 
    <behavior name="DefaultBehavior"> 
     <serviceMetadata httpGetEnabled="true"/> 
     <serviceDebug includeExceptionDetailInFaults="true"/> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 

. 이 예외는 OnStart 메서드의 FileServiceHost.Open에 throw됩니다. "작업 UploadFile을 요청하는 경우 스트림으로 사용하려면 작업의 형식이 Stream 인 단일 매개 변수가 있어야합니다."

app.config에서 서비스를 정의하는 방식에 문제가있을 것입니다. 거기에서 제거하면 모든 것이 제대로 작동하기 때문입니다. 여기서 내가 뭘 잘못하고 있니?

답변

2

내가 문제를 해결하는 방법은 끝점 동작에 webHttpBinding을 추가합니다. SOAP는 HTTP를 지원하지 않습니다 나는이 MessageContracts을 사용할 수 없습니다

<endpointBehaviors> 
    <behavior name="TestBehavior"> 
     <webHttp /> 
    </behavior> 
</endpointBehaviors> 
1

스트리밍을 WCF에서 사용하려면 여러 가지 제한이 있습니다. 그 중 하나는 유형 Stream의 단일 매개 변수 것입니다 (or any of two other types를.)

이 가능 WCF 이것은 순전히이다 (당신이 당신의 계약 에 콘텐츠를 스트리밍하려고했던 것을 "추측"을 StreamedTransferMode를 기본값 것을 의미한다 를 추측 그것은 설명하는 게 아니에요 문서가 BufferedTransferMode 기본값을 말한다)

하나의 옵션은 XML에 명시 적으로 Buffered에 전송 모드를 설정하는 것입니다 :...

<webHttpBinding> 
    <binding name="MyWebBinding" transferMode="Buffered"/> 
</webHttpBinding> 

그러나 전송 모드로 Buffered을 사용하면 메시지 내용이 완전히 버퍼링되어 전송되기 때문에 큰 파일에는 적합하지 않습니다.

또 다른 옵션은 Streamed 전송 모드를 사용하는 것입니다. 당신이 파일의 콘텐츠를 스트리밍하는 동시에 파일 이름을 제공하려면, 당신은 메시지 헤더에 사용자 정의 Message 클래스를 정의하고 파일의 메타 데이터를 전송해야합니다 :

여기
[MessageContract] 
public class UploadFileMessage 
{ 
    [MessageHeader] 
    public string Filename { get; set; } 

    [MessageBodyMember] 
    public Stream Content { get; set; } 
} 
+0

: 다음과 같이

추가 <endpoint address="" binding="webHttpBinding" contract="IFile"/>-behaviorConfiguration="TestBehavior", 그리고 TestBehavior을 정의했다. 어쨌든, 엔드 포인트에서'WebHttpBehavior'를 사용하면 문제가 해결되는 것 같습니다. – rafale

+0

잘 알고 있습니다. 당신은 당신의 질문에 대한 당신 자신의 대답을 게시하고 받아들이기를 원할 것입니다. –

관련 문제