Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带XmlSerializer的WCF:返回泛型协定时发生命名空间冲突 背景_C#_.net_Xml Serialization_Xml Namespaces_Wcf Serialization - Fatal编程技术网

C# 带XmlSerializer的WCF:返回泛型协定时发生命名空间冲突 背景

C# 带XmlSerializer的WCF:返回泛型协定时发生命名空间冲突 背景,c#,.net,xml-serialization,xml-namespaces,wcf-serialization,C#,.net,Xml Serialization,Xml Namespaces,Wcf Serialization,我正在使用WCF为C.NET web应用程序开发RESTAPI。为了更好地控制XML格式,我将其配置为使用XmlSerializer而不是默认的DataContractSerializer。我创建了一个通用的ResponseContract数据契约,它用完整性包装响应,这意味着没有使用反射进行动态更改 尝试的解决方案 不可能以声明方式更改XML属性,因为根元素及其属性在ResponseContact中是完全通用的 在运行时使用反射更改属性命名空间,例如'http://example.com/ap

我正在使用WCF为C.NET web应用程序开发RESTAPI。为了更好地控制XML格式,我将其配置为使用XmlSerializer而不是默认的DataContractSerializer。我创建了一个通用的ResponseContract数据契约,它用完整性包装响应,这意味着没有使用反射进行动态更改

尝试的解决方案 不可能以声明方式更改XML属性,因为根元素及其属性在ResponseContact中是完全通用的

在运行时使用反射更改属性命名空间,例如'http://example.com/api/Items/GetItemList"没有效果。可以获取属性,但对属性的更改没有效果。无论如何,这将破坏WSDL

在实现IXmlSerializable时,当调用WriteXml时,写入程序已经位于开始标记之后。只能重写的子节点的序列化,这不会导致任何问题。这无论如何都不会起作用,因为异常是在调用IXmlSerializable方法之前引发的

将常量名称空间与typeof或类似名称空间连接以使其唯一不起作用,因为名称空间必须是常量

默认的DataContractSerializer可以在名称中插入类型名称,例如,但DataContractSerializer的输出过于臃肿且不可读,并且缺少属性,这对于外部重用程序来说是不可行的

扩展XmlRootAttribute以不同方式生成命名空间。不幸的是,调用时没有可用的类型信息,只有泛型ResponseTract数据。可以生成一个随机名称空间来避免这个问题,但是动态更改模式会破坏WSDL元数据

将ResponseContract作为基类而不是包装器契约应该可以工作,但会导致大量重复的通用数据。例如,在上面的例子中,还有合同,它们有自己的等价物和元素

结论
有什么想法吗?

这一次我得到了风滚草徽章

我放弃了所描述的方法,因为我找不到可行的解决方案。相反,每个契约都从泛型BaseContract继承一个可为空的QueryStatus属性。主合同自动填充此属性,分包合同自动填充此属性

<?xml version="1.0" encoding="utf-8"?>
<Api xmlns="http://example.com/api/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <Response Status="OKAY" ErrorCode="OKAY" ErrorText="">
      <Data Template="ItemList">
         <Pages Template="Pagination" Size="10" Index="1" Count="13" Items="126" />
         <Items>
            <Item example="..." />
            <Item example="..." />
            <Item example="..." />
        </Items>
      </Data>
   </Response>
</Api>
ResponseContract<ItemListContract, ItemListErrorCode> GetItemList(...)
ResponseContract<ItemContract, ItemErrorCode> GetItem(...)
The top XML element 'Api' from namespace 'http://example.com/api/' references distinct types Company.Product.ApiServer.Contracts.ResponseContract`2[Company.Product.ApiServer.Contracts.Items.ItemListContract,Company.Product.ApiServer.Interfaces.Items.ItemListErrorCode] and Company.Product.ApiServer.Contracts.ResponseContract`2[Company.Product.ApiServer.Contracts.Items.ItemContract,Company.Product.ApiServer.Items.ItemErrorCode]. Use XML attributes to specify another XML name or namespace for the element or types.