C# 控制WCF响应格式和名称空间

C# 控制WCF响应格式和名称空间,c#,wcf,C#,Wcf,我希望我的WCF响应有一个带有两个使用DataContract的名称空间的响应元素,但我无法让它工作。这就是我希望得到的答复: 真的 梅克尔·威勒姆斯 这是我得到的响应(使用WCF测试客户端进行测试时): 真的 梅克尔·威勒姆斯 我的服务界面如下所示: [ServiceContract(命名空间=”http://www.test.org/test/2007/00")] 公共接口IService1 { [经营合同] [返回:MessageParameter(Name=“TestReply”

我希望我的WCF响应有一个带有两个使用DataContract的名称空间的响应元素,但我无法让它工作。这就是我希望得到的答复:


真的
梅克尔·威勒姆斯
这是我得到的响应(使用WCF测试客户端进行测试时):


真的
梅克尔·威勒姆斯
我的服务界面如下所示:

[ServiceContract(命名空间=”http://www.test.org/test/2007/00")]
公共接口IService1
{
[经营合同]
[返回:MessageParameter(Name=“TestReply”)]
GetDataResponse GetData(字符串名称);
}
服务类别:

公共类服务1:IService1
{
公共GetDataResponse GetData(字符串名称)
{
返回新的GetDataResponse
{
结果=新结果{ActionSuccessful=true},
ResultData=newresultdata{Name=Name}
};
}
}
DataContract类包括:

[DataContract(命名空间=”http://www.test2.org/test2/types")]
公共类GetDataResponse
{
[DataMember(Name=“Result”)]
公共结果结果{get;set;}
[DataMember(Name=“ResultData”)]
public ResultData ResultData{get;set;}
}
[DataContract(命名空间=”http://www.test2.org/test2/types")]
公开课成绩
{
[DataMember(Name=“ActionSuccessful”)]
公共布尔操作成功{get;set;}
}
[DataContract(命名空间=”http://www.test2.org/test2/types")]
公共类结果数据
{
[数据成员(Name=“Name”)]
公共字符串名称{get;set;}
}
我的WCF项目的目标框架是.NET4。名称空间前缀不必相同。如何以我想要的格式获取响应?

如果要从响应中删除“包装”元素,则需要使用
[MessageContract]
。下面的代码显示了一种方法。您可以使用服务/消息/数据契约中的名称空间来匹配所需内容

public class StackOverflow_15173138
{
    [ServiceContract(Namespace = "http://www.test.org/test/2007/00")]
    public interface IService1
    {
        [OperationContract]
        MyResponse GetData(MyRequest request);
    }

    public class Service1 : IService1
    {
        public MyResponse GetData(MyRequest request)
        {
            return new MyResponse
            {
                TestReply = new GetDataResponse
                {
                    Result = new Result { ActionSuccessful = true },
                    ResultData = new ResultData { Name = request.name }
                }
            };
        }
    }

    [MessageContract(IsWrapped = false)]
    public class MyResponse
    {
        [MessageBodyMember]
        public GetDataResponse TestReply { get; set; }
    }

    [MessageContract(WrapperName = "GetData")]
    public class MyRequest
    {
        [MessageBodyMember]
        public string name { get; set; }
    }

    [DataContract(Namespace = "http://www.test2.org/test2/types")]
    public class GetDataResponse
    {
        [DataMember(Name = "Result")]
        public Result Result { get; set; }

        [DataMember(Name = "ResultData")]
        public ResultData ResultData { get; set; }
    }

    [DataContract(Namespace = "http://www.test2.org/test2/types")]
    public class Result
    {
        [DataMember(Name = "ActionSuccessful")]
        public bool ActionSuccessful { get; set; }
    }

    [DataContract(Namespace = "http://www.test2.org/test2/types")]
    public class ResultData
    {
        [DataMember(Name = "Name")]
        public string Name { get; set; }
    }

    public static void Test()
    {
        string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
        ServiceHost host = new ServiceHost(typeof(Service1), new Uri(baseAddress));
        host.AddServiceEndpoint(typeof(IService1), new BasicHttpBinding(), "");
        host.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true });
        host.Open();
        Console.WriteLine("Host opened");

        ChannelFactory<IService1> factory = new ChannelFactory<IService1>(new BasicHttpBinding(), new EndpointAddress(baseAddress));
        IService1 proxy = factory.CreateChannel();
        Console.WriteLine(proxy.GetData(new MyRequest { name = "hello" }));

        ((IClientChannel)proxy).Close();
        factory.Close();

        Console.Write("Press ENTER to close the host");
        Console.ReadLine();
        host.Close();
    }
}
公共类堆栈溢出\u 15173138
{
[ServiceContract(命名空间=”http://www.test.org/test/2007/00")]
公共接口IService1
{
[经营合同]
MyResponse-GetData(MyRequest-request);
}
公共类服务1:IService1
{
公共MyResponse GetData(MyRequest请求)
{
返回新的MyResponse
{
TestReply=newgetdataresponse
{
结果=新结果{ActionSuccessful=true},
ResultData=newresultdata{Name=request.Name}
}
};
}
}
[MessageContract(IsWrapped=false)]
公共类MyResponse
{
[MessageBodyMember]
公共GetDataResponse TestReply{get;set;}
}
[MessageContract(WrapperName=“GetData”)]
公共类MyRequest
{
[MessageBodyMember]
公共字符串名称{get;set;}
}
[DataContract(命名空间=”http://www.test2.org/test2/types")]
公共类GetDataResponse
{
[DataMember(Name=“Result”)]
公共结果结果{get;set;}
[DataMember(Name=“ResultData”)]
public ResultData ResultData{get;set;}
}
[DataContract(命名空间=”http://www.test2.org/test2/types")]
公开课成绩
{
[DataMember(Name=“ActionSuccessful”)]
公共布尔操作成功{get;set;}
}
[DataContract(命名空间=”http://www.test2.org/test2/types")]
公共类结果数据
{
[数据成员(Name=“Name”)]
公共字符串名称{get;set;}
}
公共静态无效测试()
{
string baseAddress=“http://“+Environment.MachineName+”:8000/服务”;
ServiceHost主机=新ServiceHost(类型为(Service1),新Uri(基地址));
AddServiceEndpoint(typeof(IService1),新的BasicHttpBinding(),“”);
host.Description.Behaviors.Add(新ServiceMetadataBehavior{HttpGetEnabled=true});
host.Open();
Console.WriteLine(“主机已打开”);
ChannelFactory工厂=新的ChannelFactory(新的BasicHttpBinding(),新的EndpointAddress(baseAddress));
IService1 proxy=factory.CreateChannel();
WriteLine(proxy.GetData(newmyrequest{name=“hello”}));
((IClientChannel)代理).Close();
工厂关闭();
控制台。写入(“按ENTER键关闭主机”);
Console.ReadLine();
host.Close();
}
}
至@Maikel TestReply位于默认名称空间中,因此没有前缀,但其中的元素确实有前缀

xmlns:a="http://www.test2.org/test2/types
所以这个名称空间的前缀是a。(因为“a=”),它与默认名称空间不同

在方法的ServiceContractAttribute中

GetDataResponse GetData(string name); 
正如@Carlos所建议的,你可以写作

[ServiceContract(Namespace="http://www.test2.org/test2/types")]
你不能有这个

<a:TestReply xmnls:a="http://www.test2.org/test2/types">


谢谢您的快速回答,这几乎就是我想要的。XML的布局正是我想要的,但是元素没有“a:”前缀。。。有什么想法吗?没有简单的方法来定制WCF生成的XML中的前缀-前缀应该只用于定义名称空间,并且您通常无法选择使用哪个前缀。如果你真的想定制它们,你可以这样做,但这并不是一件小事——上的帖子展示了一种定制方法。对不起,这不是我的意思。我不介意前缀是“a”,但我希望节点(因此是正文的第一个子节点)也有它:。使用代码时,其中的所有节点都有前缀(这很好),但节点本身没有前缀。