POX SVCUtil生成类强制转换
本文关键字:转换 SVCUtil POX | 更新日期: 2023-09-27 17:51:04
我使用SVCUTIL从XSD生成一个类。我很难弄清楚如何获取传入的请求对象并从对象中检索"MsgType"值。
我想通过这样做,我可以简单地使用:
访问数据。request.Request.MsgType
然而,事情并没有这么简单。"请求"给我的唯一选择是:=GetHashCode方法GetSchema方法节点ReadXMLToStringWriteXML
即可是否有某种类型的类型转换,我需要做序列化的对象,以访问MsgType?
public ServiceProviderTic callRequestFunc(ServiceProviderTic request) {
//How do I get request.Request.MsgType Value?
}
生成类中的根元素:
using System.Runtime.Serialization;
[assembly: System.Runtime.Serialization.ContractNamespaceAttribute("", ClrNamespace="")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="RequestType", Namespace="")]
[System.Runtime.Serialization.KnownTypeAttribute(typeof(ResponseType))]
[System.Runtime.Serialization.KnownTypeAttribute(typeof(DateTimeInfoType))]
[System.Runtime.Serialization.KnownTypeAttribute(typeof(OriginType))]
[System.Runtime.Serialization.KnownTypeAttribute(typeof(LocaleInfoType))]
[System.Runtime.Serialization.KnownTypeAttribute(typeof(ProductType))]
[System.Runtime.Serialization.KnownTypeAttribute(typeof(ValueType))]
[System.Runtime.Serialization.KnownTypeAttribute(typeof(AuthInfoType))]
public partial class RequestType : object, System.Runtime.Serialization.IExtensibleDataObject
{
private RequestType.MsgTypeType MsgTypeField;
[System.Runtime.Serialization.DataMemberAttribute(IsRequired=true)]
public RequestType.MsgTypeType MsgType
{
get
{
return this.MsgTypeField;
}
set
{
this.MsgTypeField = value;
}
}
[System.Runtime.Serialization.DataContractAttribute(Name="RequestType.MsgTypeType", Namespace="")]
public enum MsgTypeType : int
{
[System.Runtime.Serialization.EnumMemberAttribute()]
act = 0
}
}
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Xml.Serialization.XmlSchemaProviderAttribute("ExportSchema")]
[System.Xml.Serialization.XmlRootAttribute(IsNullable=false)]
public partial class ServiceProviderTic : object, System.Xml.Serialization.IXmlSerializable
{
private System.Xml.XmlNode[] nodesField;
private static System.Xml.XmlQualifiedName typeName = new System.Xml.XmlQualifiedName("ServiceProviderTic", "");
public System.Xml.XmlNode[] Nodes
{
get
{
return this.nodesField;
}
set
{
this.nodesField = value;
}
}
public void ReadXml(System.Xml.XmlReader reader)
{
this.nodesField = System.Runtime.Serialization.XmlSerializableServices.ReadNodes(reader);
}
public void WriteXml(System.Xml.XmlWriter writer)
{
System.Runtime.Serialization.XmlSerializableServices.WriteNodes(writer, this.Nodes);
}
public System.Xml.Schema.XmlSchema GetSchema()
{
return null;
}
public static System.Xml.XmlQualifiedName ExportSchema(System.Xml.Schema.XmlSchemaSet schemas)
{
System.Runtime.Serialization.XmlSerializableServices.AddDefaultSchema(schemas, typeName);
return typeName;
}
XML: <ServiceProviderTic>
<Request>
<MsgType>act</MsgType>
XSD模式<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="ServiceProvideTic" nillable="false">
<xs:annotation>
<xs:documentation></xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="Version" type="xs:string" nillable="false"/>
<xs:choice>
<xs:element name="Request" type="RequestType" nillable="false"/>
<xs:element name="Response" type="ResponseType" nillable="false"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="RequestType">
<xs:annotation>
<xs:documentation> Request Information</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="MsgType" nillable="false">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="act"/>
查看这里关于创建支持XML和JSON的REST web服务的一些好的建议(参见WebHttpBehavior类)
除此之外,我不知道该怎么处理你的XSD。
经过几天的学习和研究如何访问数据而不使用旧的方式。以下是我想到的:
Microsoft提供了XSD和SVCUTIL,用于将XSD转换为类并使它们可序列化。我被困在这个项目上的原因是因为复杂的类型,我以前从未做过这个。我使用:
命令提示符:XSD.exe ServiceProviderTic。xsd/类
生成ServiceProviderTic.cs
创建了一个web服务:
接口:
[OperationContract]
[WebInvoke(Method = "POST", UriTemplate="/MyService", RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare)]
XElement callRequestFunc(XElement request);
类:
public XElement callRequestFunc(XElement request)
{
ServiceProviderTic requestSer = Utility.DeserializeData(request);
if (requestSer.Item.GetType() == typeof(RequestType))
{
RequestType reqObj = (RequestType)requestSer.Item;
string datapiece = reqObj.MsgType.ToString();
}
XElement responseSer = Utility.SerializeData(requestSer);
return responseSer;
}
}
XElement帮助我接受普通旧xml (POX)并响应普通旧xml。下面是对xelement进行序列化和反序列化的辅助函数。我还包含了额外的代码来删除我不需要的名称空间。
public class Utility
{
public static ServiceProviderTic DeserializeData(XElement request)
{
var ser = new XmlSerializer(typeof(ServiceProviderTic));
return (ServiceProviderTic)ser.Deserialize(request.CreateReader());
}
public static XElement SerializeData(ServiceProviderTic response)
{
using (var memoryStream = new MemoryStream())
{
using (TextWriter streamWriter = new StreamWriter(memoryStream))
{
var xmlSerializer = new XmlSerializer(typeof(ServiceProviderTic));
xmlSerializer.Serialize(streamWriter, response);
return Utility.RemoveAllNamespaces(XElement.Parse(Encoding.ASCII.GetString(memoryStream.ToArray())));
}
}
}
public static XElement RemoveAllNamespaces(XElement source)
{
return !source.HasElements
? new XElement(source.Name.LocalName)
{
Value = source.Value
}
: new XElement(source.Name.LocalName, source.Elements().Select(el => RemoveAllNamespaces(el)));
}
}
我希望这对将来的人有所帮助!