2013-03-14 6 views
4

따라서 FaultExceptionBasicHttpBinding을 사용할 때 적절한 결과를 제공하지 못하는 것으로 나타났습니다. WSHttpBinding을 사용하면 파일이 작동합니다. 나는 다음과 같은 FaultException를 던질 경우에만 다시 점점 첫 번째 (FaultReasonText 1)을 의미 fault.Reason.Translations 카운트가 1 인 클라이언트에 도달하면BasicHttpBinding을 사용할 때 FaultException이 올바로 작동하지 않습니다.

문제는, WCF 서비스에서

var translations = new List<FaultReasonText> { new FaultReasonText("FaultReasonText 1"), new FaultReasonText("FaultReasonText 2") }; 

throw new FaultException<MessageServiceFault>(MessageServiceFault.Fault1, new FaultReason(translations)); 

입니다 고객에게.

하지만 WSHttpBinding을 사용할 때 개수는 2입니다. 문제가있는 곳은 어디입니까? 아무도 이것에 나를 도울 수 있습니까.

내가 은 BasicHttpBinding & WsHttpBinding과 바인딩 아래의 코드를 테스트 할 때 그것은 나에게 다른 결과를 제공합니다.

class Program 
{ 
    static void Main(string[] args) 
    { 
     try 
     { 
      string baseAddress = "http://" + Environment.MachineName + ":8000/Service"; 
      ServiceHost host = new ServiceHost(typeof(MessageService), new Uri(baseAddress)); 
      host.AddServiceEndpoint(typeof(IMessageService), new WSHttpBinding(), ""); 
      host.Open(); 
      Console.WriteLine("Host opened"); 

      ChannelFactory<IMessageService> myChannelFactory = new ChannelFactory<IMessageService>(new WSHttpBinding(), new EndpointAddress(baseAddress)); 
      IMessageService channel = myChannelFactory.CreateChannel(); 
      var response = channel.GetMessage(); 
     } 
     catch (FaultException fault) 
     { 
      fault.Reason.Translations.ToList().ForEach(i => Console.WriteLine(i.Text)); 
      Console.WriteLine(false); 
     } 
    } 
} 

[ServiceContract] 
public interface IMessageService 
{ 
    [OperationContract] 
    [FaultContract(typeof(MessageServiceFault))] 
    string GetMessage(); 
} 

public class MessageService : IMessageService 
{ 
    public string GetMessage() 
    { 
     var translations = new List<FaultReasonText> { new FaultReasonText("FaultReasonText 1"), new FaultReasonText("FaultReasonText 2") }; 

     throw new FaultException<MessageServiceFault>(MessageServiceFault.Fault1, new FaultReason(translations)); 
    } 
} 

[DataContract] 
public enum MessageServiceFault 
{ 
    [EnumMember] 
    Fault1, 

    [EnumMember] 
    Fault2 
} 

편집는 :

그러나,이 article 당신은 사용자의 언어 설정에 따라에서 발탁 다른 텍스트 문자열의 수를 제공 할 수 있습니다 말했다. 번역 버킷에는 서로 다른 모든 텍스트 문자열과 관련 문화 식별자 (FaultReasonText로 함께 묶음)가 있습니다. 오류 이유 또는 번역 검색에 대한 culture가 지정되지 않은 경우 가정 된 문화는 현재 스레드 문화입니다. 예를 들어 'en-UK'로 번역하려는 경우 먼저 'en-UK'를 찾은 다음 'en'을 찾습니다. 그래도 일치하는 항목을 찾지 못하면 목록에있는 첫 번째 번역을 가져옵니다.

WsHttpBinding의 경우을 반환하는 이유는 무엇입니까?

답변

0

FaultException을 사용하려면 웹 서비스에서 SOAP 1.2를 활성화해야합니다.

BasicHttpBinding은 SOAP 1.1을 사용하고, WSHttpBinding은 SOAP 1.2를 사용합니다. 이것이 WSHttpBinding에서 작동하고 BasicHttpBinding에서는 작동하지 않는 이유입니다. 당신이 this tool와 함께 기본은 BasicHttpBinding을 변환하면

<customBinding> 
    <binding name="simpleBinding"> 
     <textMessageEncoding messageVersion="Soap12" writeEncoding="utf-8" /> 
     <httpTransport /> 
    </binding> 
</customBinding> 

는 : 대신은 BasicHttpBinding을 사용

, 당신은 더 나은 textMessageEncoding 및 httpTransport와 customBindings을 사용해야합니다 당신은 얻을 것이다 :

<!-- generated via Yaron Naveh's http://webservices20.blogspot.com/ --> 
<customBinding> 
    <binding name="NewBinding0"> 
     <textMessageEncoding MessageVersion="Soap11" /> 
     <httpTransport /> 
    </binding> 
</customBinding> 
<!-- generated via Yaron Naveh's http://webservices20.blogspot.com/ --> 

소스 바인딩 :

<bindings> 
    <basicHttpBinding> 
     <binding name="NewBinding0" /> 
    </basicHttpBinding> 
</bindings> 

SOAP 12를 활성화하면 작동하지 않습니다.

+1

-1 : 사실이 아닙니다. 'basicHttpBinding'도 SOAP 1.2를 지원합니다. –

+1

@ JohnSaunders, RomEh 대답이 정확하지 않습니다. 하지만 basicHttpBinding은 SOAP 1.2를 지원하지 않습니다. 이것을 읽으십시오 http://msdn.microsoft.com/en-us/library/ms731361.aspx –

+1

당신은 저를 신뢰하지 않으며 다만이 공구를보십시오 : http://webservices20.cloudapp.net/default. aspx. –

관련 문제