Wcf发送xml内容类型而不是json,

时间:2015-01-05 14:24:00

标签: c# json wcf

拥有WCF服务器和WCF客户端。以下是客户端代码:

[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 个答案:

答案 0 :(得分:1)

这是因为您的WCF客户端(Proxy)正在服务方法的操作上下文中运行(其中包含有关传入请求的信息),并且会覆盖应由以下内容使用的上下文:传出请求。要解决此问题,您需要在执行调用时创建新的操作上下文范围,以便它将使用WebInvoke / WebGet属性中的相应属性:

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