2015-01-05 2 views
2

имеет WCF-сервер и WCF-клиент. Ниже приведен код клиента:Wcf отправляет xml-тип контента вместо json,

[GeneratedCode("System.ServiceModel", "3.0.0.0")] 
[ServiceContract(ConfigurationName = "IMyService")] 
public interface IMyService 
{ 
    [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, UriTemplate = "DoSmth")] 
    [OperationContract(Action = "http://tempuri.org/IConfigService/SetSettings")] 
    OrigamiHttpResponse<List<ErrorRecords>> DoSmth(int param); 
} 

public class MyService: BaseClient<IMyService> 
{ 
    public ConfigServiceClient(AuthResult authObject) : base(authObject, null) 
    { 
    } 

    public OrigamiHttpResponse<List<ErrorRecords>> DoSmth(int param) 
    { 
     return Proxy.DoSmth(param); 
    } 
} 

public abstract class BaseClient<T> : BaseClient where T : class 
{ 
    protected T Proxy { get; private set; } 

    protected BaseClient(AuthResult authObject, IConfig config) 
     : base(authObject, config) 
    { 
     var factory = new ChannelFactory<T>("*"); 

     if (factory.Endpoint == null || factory.Endpoint.Address == null) 
      throw new Exception("WCF Endpoint is not configured"); 

     if (factory.Endpoint.Address.Uri.Scheme.ToLower() == "https") 
      HttpAccess.PrepareSslRequests(); 

     if (_authObject != null) 
     { 
      var cb = new CookieBehavior(_authObject); 
      factory.Endpoint.Behaviors.Add(cb); 
     } 

     Proxy = factory.CreateChannel(); 
    } 
} 

Когда я вызываю метод DoSmth() из консольного приложения, тип контента JSON. Но моя архитектура заключается в том, что я вызываю метод прокси, а затем прокси-сервер действует как клиент для wcf-сервера и вызывает метод wcf, который является моим DoSmth(). В этом случае тип контента - xml, и я не могу его изменить. Может быть, проблема в контексте работы, потому что это один вызов от другого. Может ли кто-нибудь помочь?

ответ

1

Это связано с тем, что ваш WCF-клиент (Proxy) запущен в контексте операции в методе службы (который содержит информацию о входящем запросе) и что переопределяет контекст, который должен использоваться исходящим запросом , Чтобы это исправить, необходимо создать новый рабочий контекст сферы при выполнении вызова, так что он будет использовать соответствующее свойство из WebInvoke/WebGet атрибуты:

public OrigamiHttpResponse<List<ErrorRecords>> DoSmth(int param) 
{ 
    using (new OperationContextScope((IContextChannel)Proxy)) 
    { 
     return Proxy.DoSmth(param); 
    } 
} 
+0

Да, проблема в этом контексте, спасибо! –

Смежные вопросы