C# 用c语言读取SOAP数组#
我正在使用来自第三方网站的web服务。我在wsdl文件中有一个名为GetItemAvailable的类型和方法。当我使用并执行服务时,它返回一个SOAP数组(在wsdl中定义为ItemsArray)。 问题是,我不确定我需要使用哪种类型来获取信息。这是我的密码:C# 用c语言读取SOAP数组#,c#,soap,C#,Soap,我正在使用来自第三方网站的web服务。我在wsdl文件中有一个名为GetItemAvailable的类型和方法。当我使用并执行服务时,它返回一个SOAP数组(在wsdl中定义为ItemsArray)。 问题是,我不确定我需要使用哪种类型来获取信息。这是我的密码: GetItemAvailable.GetItemAvailable gia = new GetItemAvailable.GetItemAvailable(); ItemsArray ia = new ItemsArray(); ia
GetItemAvailable.GetItemAvailable gia = new GetItemAvailable.GetItemAvailable();
ItemsArray ia = new ItemsArray();
ia = (gia.CallGetItemAvailable("1088507721", "9780842387491"));
string sttest = ia.id[1].ToString();
错误总是说ia.id为null
我做错了什么?我对肥皂不太熟悉。
以下是wsdl:
<wsdl:definitions>
<wsdl:types>
<xsd:complexType name="Items">
<xsd:all>
<xsd:element name="item_id" type="xsd:string" />
<xsd:element name="tn_onhand" type="xsd:int" />
<xsd:element name="tn_onorder" type="xsd:string" />
<xsd:element name="tn_onorder_eta" type="xsd:string" />
<xsd:element name="nv_onhand" type="xsd:int" />
<xsd:element name="nv_onorder" type="xsd:string" />
<xsd:element name="nv_onorder_eta" type="xsd:string" />
<xsd:element name="error" type="xsd:string" />
</xsd:all>
</xsd:complexType>
<xsd:complexType name="ItemsArray">
<xsd:complexContent mixed="false">
<xsd:restriction base="SOAP-ENC:Array">
<xsd:attribute wsdl:arrayType="tns:Items[]" ref="SOAP-ENC:arrayType" />
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="GetItemAvailableRequestType">
<xsd:all>
<xsd:element name="api_key" type="xsd:string" />
<xsd:element name="Items" type="xsd:string" />
</xsd:all>
</xsd:complexType>
<xsd:complexType name="GetItemAvailableResponseType">
<xsd:all>
<xsd:element name="GetItemAvailableResult" type="tns:ItemsArray" />
</xsd:all>
</xsd:complexType>
<xsd:element name="GetItemAvailable" type="tns:GetItemAvailableRequestType" />
<xsd:element name="GetItemAvailableResponse" type="tns:GetItemAvailableResponseType" />
</xsd:schema>
</wsdl:types>
<wsdl:message name="GetItemAvailableRequest">
<wsdl:part name="parameters" element="tns:GetItemAvailable" />
</wsdl:message>
<wsdl:message name="GetItemAvailableResponse">
<wsdl:part name="parameters" element="tns:GetItemAvailableResponse" />
</wsdl:message>
<wsdl:portType name="GetItemAvailablePortType">
<wsdl:operation name="GetItemAvailable">
<documentation>Returns quantity available and on order for list of products seperated by comma (example: 9780877840756,9780446691093)</documentation>
<wsdl:input message="tns:GetItemAvailableRequest" />
<wsdl:output message="tns:GetItemAvailableResponse" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="GetItemAvailableBinding" type="tns:GetItemAvailablePortType">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="GetItemAvailable">
<soap:operation soapAction="http://www.stl-distribution.com/GetItemAvailable" style="document" />
<wsdl:input>
<soap:body use="literal" namespace="http://www.stl-distribution.com" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" namespace="http://www.stl-distribution.com" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="GetItemAvailable">
<wsdl:port name="GetItemAvailablePort" binding="tns:GetItemAvailableBinding">
<soap:address location="http://www.stl-distribution.com/webservices/soap/GetItemAvailable.php" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
返回以逗号分隔的产品列表的可用数量和订单数量(例如:978087784075697804466991093)
不应该这样吗
//string sttest = ia.id[1].ToString();
string sttest = ia[0].item_id;
亨克说的有道理 还有,这是为你准备的。基于以下wsdl:
<xsd:complexType name="Items">
<xsd:all>
<xsd:element name="item_id" type="xsd:string" />
<xsd:element name="tn_onhand" type="xsd:int" />
<xsd:element name="tn_onorder" type="xsd:string" />
<xsd:element name="tn_onorder_eta" type="xsd:string" />
<xsd:element name="nv_onhand" type="xsd:int" />
<xsd:element name="nv_onorder" type="xsd:string" />
<xsd:element name="nv_onorder_eta" type="xsd:string" />
<xsd:element name="error" type="xsd:string" />
</xsd:all>
</xsd:complexType>
这可能有帮助,也可能没有帮助,但值得一试。再次查看wsdl:
<xsd:complexType name="GetItemAvailableResponseType">
<xsd:all>
<xsd:element name="GetItemAvailableResult" type="tns:ItemsArray" />
</xsd:all>
</xsd:complexType>
似乎响应的对象GetItemsAvailableResult实际上是f类型的ItemsArray
您是否尝试过ia.GetItemsAvailableResult[0]。项目id是否已确定
希望这会有所帮助。顺便说一句,我添加了另一个答案,因为在注释中添加代码片段太麻烦了
干杯,瓦格纳。我通过编写一个新类来包装WSDL文件,解决了这个问题。 我想我一开始就应该这么做。 谢谢大家的帮助
public class STLItemAvailable
{
private string _itemNumber;
public string ItemNumber
{
get
{
return _itemNumber;
}
}
private int _tnOnHand;
public int TNOnHand
{
get
{
return _tnOnHand;
}
}
private int _tnOnOrder;
public int TNOnOrder
{
get
{
return _tnOnOrder;
}
}
private DateTime _tnOrderETA;
public DateTime TNOrderETA
{
get
{
return _tnOrderETA;
}
}
private int _nvOnHand;
public int NVOnHand
{
get
{
return _nvOnHand;
}
}
private int _nvOnOrder;
public int NVOnOrder
{
get
{
return _nvOnOrder;
}
}
private DateTime _nvOrderETA;
public DateTime NVOrderETA
{
get
{
return _nvOrderETA;
}
}
public STLItemAvailable()
{
//
// TODO: Add constructor logic here
//
}
public STLItemAvailable(string APIKey, string ItemNumber)
{
GetItemAvailable gia = new GetItemAvailable();
ItemsArray ia = gia.CallGetItemAvailable(APIKey, ItemNumber);
XmlElement[] XEArray = ia.Any;
XmlNode n = XEArray[0];
int testn = 0;
DateTime testd;
foreach (XmlNode xn in n.ChildNodes)
{
switch (xn.Name)
{
case "item_id":
this._itemNumber = xn.InnerText;
break;
case "tn_onhand":
int.TryParse(xn.InnerText, out testn);
this._tnOnHand = testn;
break;
case "tn_onorder":
int.TryParse(xn.InnerText, out testn);
this._tnOnOrder = testn;
break;
case "tn_onorder_eta":
DateTime.TryParse(xn.InnerText, out testd);
this._tnOrderETA = testd;
break;
case "nv_onhand":
int.TryParse(xn.InnerText, out testn);
this._nvOnHand = testn;
break;
case "nv_onorder":
int.TryParse(xn.InnerText, out testn);
this._nvOnOrder = testn;
break;
case "nv_onorder_eta":
DateTime.TryParse(xn.InnerText, out testd);
this._nvOrderETA = testd;
break;
为什么要创建一个新的
ItemsArray
,然后覆盖它?还有,您是如何使用这个WSDL的?“添加服务引用”?我在app\u webreferences文件夹中添加了一个web引用。很抱歉,Henk,我在发布答案时没有看到您将其作为item\u id。代码确实编译。我无法将带[]的索引应用于GetItemAvailable类型的表达式。但我得到了愚蠢的信息。无法将带[]的索引应用于GetItemAvailable.IemArray类型的表达式。我想这意味着它不是一个真正的数组,所以我不知道如何在它可能是ia.Items[0]中读取它,在生成的.cs或Intellisense中查找。这是我不理解的。没有生成.cs。app_webreferences文件夹只有.disco和.wsdl。我是否需要尝试运行wsld.exe工具?我正在使用同一家公司的另一个web服务,使用的方式与只返回一个字符串而不是数组的方式相同,它工作正常。@Tim,将光标放在ia
上,点击[F12]将我带到这个名称空间GetItemAvailable{[Serializable][GeneratedCode(“System.Xml”,“2.0.50727.3082”)][DebuggerStepThrough][DesignerCategory(“code”)][XmlType(Namespace=“public class ItemsArray:Array{public ItemsArray();}
public class STLItemAvailable
{
private string _itemNumber;
public string ItemNumber
{
get
{
return _itemNumber;
}
}
private int _tnOnHand;
public int TNOnHand
{
get
{
return _tnOnHand;
}
}
private int _tnOnOrder;
public int TNOnOrder
{
get
{
return _tnOnOrder;
}
}
private DateTime _tnOrderETA;
public DateTime TNOrderETA
{
get
{
return _tnOrderETA;
}
}
private int _nvOnHand;
public int NVOnHand
{
get
{
return _nvOnHand;
}
}
private int _nvOnOrder;
public int NVOnOrder
{
get
{
return _nvOnOrder;
}
}
private DateTime _nvOrderETA;
public DateTime NVOrderETA
{
get
{
return _nvOrderETA;
}
}
public STLItemAvailable()
{
//
// TODO: Add constructor logic here
//
}
public STLItemAvailable(string APIKey, string ItemNumber)
{
GetItemAvailable gia = new GetItemAvailable();
ItemsArray ia = gia.CallGetItemAvailable(APIKey, ItemNumber);
XmlElement[] XEArray = ia.Any;
XmlNode n = XEArray[0];
int testn = 0;
DateTime testd;
foreach (XmlNode xn in n.ChildNodes)
{
switch (xn.Name)
{
case "item_id":
this._itemNumber = xn.InnerText;
break;
case "tn_onhand":
int.TryParse(xn.InnerText, out testn);
this._tnOnHand = testn;
break;
case "tn_onorder":
int.TryParse(xn.InnerText, out testn);
this._tnOnOrder = testn;
break;
case "tn_onorder_eta":
DateTime.TryParse(xn.InnerText, out testd);
this._tnOrderETA = testd;
break;
case "nv_onhand":
int.TryParse(xn.InnerText, out testn);
this._nvOnHand = testn;
break;
case "nv_onorder":
int.TryParse(xn.InnerText, out testn);
this._nvOnOrder = testn;
break;
case "nv_onorder_eta":
DateTime.TryParse(xn.InnerText, out testd);
this._nvOrderETA = testd;
break;