基于WCF PARAMS系列化定制 [英] WCF Custom serialization based on params
本文介绍了基于WCF PARAMS系列化定制的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我可以实现一些自定义的序列化(SOAP)来序列仅领域至极可以动态改变
类:
[DataContract]
公共类视频
{
...
[数据成员]
公众诠释宽度{获得;组; }
[数据成员]
公众诠释身高{获得;组; }
[数据成员]
公共短比特率{搞定;组; }
[数据成员]
公共短帧率{搞定;组; }
[数据成员]
公众持续时间长{搞定;组; }
[数据成员(EmitDefaultValue = FALSE)]
公众的VideoType类型{搞定;组; }
}
WCF方法:
公共视频GetPartVideo(PARAMS字符串[]字段)
{
变种视频=新的视频
{
NAME =测试视频,
说明=测试视频的说明,
CreatedAt = DateTime.Now,
ModifiedAt = DateTime.Now,
URL =
文件名=,
文件大小= 100,
宽度= 640,
高度= 480,
比特率= 120,
帧率= 32 ,
持续时间= 100200300,
类型= VideoType.StandardDefinition
};
返回视频;
}
方法调用:
< GetPartVideo>
< MethodParameters>
<田attr0 =字符串数组的isNull =false的>
< StringArray0>名称和LT; / StringArray0>
< StringArray1>说明与LT; / StringArray1>
< /田>
< / MethodParameters>
< / GetPartVideo>
SOAP响应(简体):
< GetPartVideo>
< MethodParameters>
<视频>
<说明>在测试视频和LT的说明; /说明>
<名称>测试影片版权< /名称>
< /视频>
< / MethodParameters>
< / GetPartVideo>
解决方案
我发现我自己的反应。
有可能使用串行格式属性,改变系列化
公共类CustomDataContractSerializerOperationBehavior:DataContractSerializerOperationBehavior
{
公共CustomDataContractSerializerOperationBehavior(OperationDescription operationDescription):基地(operationDescription){}
公众覆盖XmlObjectSerializer CreateSerializer(类型类型,字符串名称,字符串NS, IList的<类型> knownTypes)
{
变种字典=新XmlDictionary(2);
dictionary.Add(名);
dictionary.Add(NS);
返回新MyCustomDataContractSerializer(
型,
新XmlDictionaryString(字典,姓名,0),
新XmlDictionaryString(字典,NS,1),
knownTypes);
}
公众覆盖XmlObjectSerializer CreateSerializer(类型类型,XmlDictionaryString名,XmlDictionaryString NS,IList的<类型> knownTypes)
{
返回新MyCustomDataContractSerializer(
类型,
的名字,
NS,
knownTypes);
}
}
公共类CustomDataContractFormatAttribute:属性,IOperationBehavior
{
公共无效AddBindingParameters(OperationDescription描述,BindingParameterCollection参数)
{
}
公共无效ApplyClientBehavior(OperationDescription描述,ClientOperation代理)
{
ReplaceDataContractSerializerOperationBehavior(介绍);
}
公共无效ApplyDispatchBehavior(OperationDescription描述,DispatchOperation派遣)
{
ReplaceDataContractSerializerOperationBehavior(介绍);
}
公共无效验证(OperationDescription描述)
{
}
私有静态无效ReplaceDataContractSerializerOperationBehavior(OperationDescription描述)
{
DataContractSerializerOperationBehavior DCS = description.Behaviors.Find< DataContractSerializerOperationBehavior>();
如果(DCS!= NULL)
description.Behaviors.Remove(DCS);
description.Behaviors.Add(新CustomDataContractSerializerOperationBehavior(介绍));
}
}
也是类MyCustomDataContractSerializer应覆盖XmlObjectSerializer
和服务可以用自定义格式加以装饰属性。
[的ServiceContract(命名空间=http://tesmpuri.com/)]
[ServiceKnownType(typeof运算(视频))]
公共接口IPartialResponseTestService
{
[OperationContract的]
。视频GetFullVideo();
[OperationContract的]
[CustomDataContractFormat]
视频GetPartVideo(PARAMS字符串[]字段);
[OperationContract的]
[XmlSerializerFormat]
视频GetVideo();
}
Can I implement some custom serialization (SOAP) to serialize only the fields wich can be changed dynamically
Class:
[DataContract]
public class Video
{
...
[DataMember]
public int Width { get; set; }
[DataMember]
public int Height { get; set; }
[DataMember]
public short Bitrate { get; set; }
[DataMember]
public short Framerate { get; set; }
[DataMember]
public long Duration { get; set; }
[DataMember(EmitDefaultValue = false)]
public VideoType Type { get; set; }
}
WCF Method:
public Video GetPartVideo(params string[] fields)
{
var video = new Video
{
Name = "Test Video",
Description = "Description of the Test Video",
CreatedAt = DateTime.Now,
ModifiedAt = DateTime.Now,
Url = "",
FileName = "",
FileSize = 100,
Width = 640,
Height = 480,
Bitrate = 120,
Framerate = 32,
Duration = 100200300,
Type = VideoType.StandardDefinition
};
return video;
}
Method call:
<GetPartVideo>
<MethodParameters>
<fields attr0="StringArray" isNull="false">
<StringArray0>Name</StringArray0>
<StringArray1>Description</StringArray1>
</fields>
</MethodParameters>
</GetPartVideo>
SOAP Response (simplified):
<GetPartVideo>
<MethodParameters>
<Video>
<Description>Description of the Test Video</Description>
<Name>Test Video</Name>
</Video>
</MethodParameters>
</GetPartVideo>
解决方案
I have found the response by myself.
It is possible to use Serializer Format Attribute, to change serialization
public class CustomDataContractSerializerOperationBehavior : DataContractSerializerOperationBehavior
{
public CustomDataContractSerializerOperationBehavior(OperationDescription operationDescription) : base(operationDescription) { }
public override XmlObjectSerializer CreateSerializer(Type type, string name, string ns, IList<Type> knownTypes)
{
var dictionary = new XmlDictionary(2);
dictionary.Add(name);
dictionary.Add(ns);
return new MyCustomDataContractSerializer(
type,
new XmlDictionaryString(dictionary, name, 0),
new XmlDictionaryString(dictionary, ns, 1),
knownTypes);
}
public override XmlObjectSerializer CreateSerializer(Type type, XmlDictionaryString name, XmlDictionaryString ns, IList<Type> knownTypes)
{
return new MyCustomDataContractSerializer(
type,
name,
ns,
knownTypes);
}
}
public class CustomDataContractFormatAttribute : Attribute, IOperationBehavior
{
public void AddBindingParameters(OperationDescription description, BindingParameterCollection parameters)
{
}
public void ApplyClientBehavior(OperationDescription description, ClientOperation proxy)
{
ReplaceDataContractSerializerOperationBehavior(description);
}
public void ApplyDispatchBehavior(OperationDescription description, DispatchOperation dispatch)
{
ReplaceDataContractSerializerOperationBehavior(description);
}
public void Validate(OperationDescription description)
{
}
private static void ReplaceDataContractSerializerOperationBehavior(OperationDescription description)
{
DataContractSerializerOperationBehavior dcs = description.Behaviors.Find<DataContractSerializerOperationBehavior>();
if (dcs != null)
description.Behaviors.Remove(dcs);
description.Behaviors.Add(new CustomDataContractSerializerOperationBehavior(description));
}
}
also the class MyCustomDataContractSerializer should override the XmlObjectSerializer
and Service can be decorated with the custom format attributes
[ServiceContract(Namespace = "http://tesmpuri.com/")]
[ServiceKnownType(typeof(Video))]
public interface IPartialResponseTestService
{
[OperationContract]
Video GetFullVideo();
[OperationContract]
[CustomDataContractFormat]
Video GetPartVideo(params string[] fields);
[OperationContract]
[XmlSerializerFormat]
Video GetVideo();
}
这篇关于基于WCF PARAMS系列化定制的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文