麻烦填充由svcutil生成的类关闭wsdl

时间:2012-11-19 20:53:59

标签: c# xml wcf serialization

更新:2012年11月26日 我使用wsdl.exe而不是svcutil更新了我自动生成的c#类,因此我可以在代理类中获取SOAP属性(我正在调用SOAP服务)。我最初的问题是序列化,但在markus的帮助下,我现在可以序列化了。但是现在我从服务中得到了一个错误:

无效的请求对象:它必须是查询请求

我硬编码时可以使用的xml:

<xml version="1.0"?><Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
<Header/><Body>
<QueryRequest xmlns="http://emkt.pjm.com/emkt/xml">
<QueryMarketResults type="Virtual" day="2012-11-16"><All/>
</QueryMarketResults></QueryRequest></Body></Envelope>

它产生的xml是:

<?xml version="1.0" encoding="utf-16"?>
<QueryRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://emkt.pjm.com/emkt/xml">
  <QueryMarketResults day="2012-11-16" type="Virtual">
    <All />
  </QueryMarketResults>
</QueryRequest>

我错过了信封和身体标签。我尝试了如下序列化,但得到错误“生成XML文档时出错”。

XmlTypeMapping myTypeMapping = (new SoapReflectionImporter().ImportTypeMapping(typeof (QueryRequest)));
XmlSerializer serializer = new XmlSerializer(myTypeMapping);

以下是相关的代理类:(我在QueryRequest上添加了下面的[XmlRoot]属性,它确实添加了正确的命名空间)

[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=false, Namespace="http://emkt.pjm.com/emkt/xml")]
[XmlRoot(Namespace = "http://emkt.pjm.com/emkt/xml")]
public partial class QueryRequest {

    private object[] itemsField;

    private ItemsChoiceType1[] itemsElementNameField;

    [System.Xml.Serialization.XmlElementAttribute("QueryPortfolios", typeof(QueryPortfoliosType))]
    [System.Xml.Serialization.XmlElementAttribute("QueryVirtualBid", typeof(QueryByAllLocationDayType))]
    [System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemsElementName")]
    public object[] Items {
        get {
            return this.itemsField;
        }
        set {
            this.itemsField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("ItemsElementName")]
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public ItemsChoiceType1[] ItemsElementName {
        get {
            return this.itemsElementNameField;
        }
        set {
            this.itemsElementNameField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://emkt.pjm.com/emkt/xml", IncludeInSchema=false)]
public enum ItemsChoiceType1 {
    QueryPortfolios,
    QueryVirtualBid,
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

构造函数不会为数组赋值,因此它们将为null。

试试这个:

var qr = new QueryRequest
{
    ItemsElementName = new ItemsChoiceType1[] {
        ItemsChoiceType1.QueryMarketResults,
    },
    Items = new object[] {
        new QueryByAllLocationDayTypeType
        {
            ItemElementName = ItemChoiceType3.All,
            Item = new QueryAllType(),
            day = Convert.ToDateTime("2012-11-16"),
            type = MarketQueryTypeType.Virtual,
        },
    },
}

或者,等效地没有对象初始化器:

var qmr = new QueryByAllLocationDayTypeType();
qmr.ItemElementName = ItemChoiceType3.All;
qmr.Item = new QueryAllType();
qmr.day = Convert.ToDateTime("2012-11-16");
qmr.type = MarketQueryTypeType.Virtual;

var qr = new QueryRequest();
qr.ItemsElementName = new ItemsChoiceType1[1];
qr.ItemElementName[0] = ItemsChoiceType1.QueryMarketResults;
qr.Items = new object[1];
qr.Items[0] = qmr;