我正在研究webservice.I想要将XmlDocument传递给webservice.But中的方法,然后阅读其中一篇文章来传递XElement。我从Windows窗体调用Web服务,但它抛出异常
XmlDocument doc = new XmlDocument();
doc.Load(FilePath);
MyClient client = new MyClient();
XElement element = XElement.Load(new XmlNodeReader(doc));
client.PassXml(element);//Exception at this line
client.Close();
我的网络服务
接口
[OperationContract]
[WebInvoke(Method = "POST",BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Xml)]
string PassXml(XElement doc);
扩展接口的类
public class Service: IService
{
public string PassXml(XElement doc)
{
//My Logic
return "Done";
}
}
我尝试了以下方式,但无法使其正常工作
[DataContract]
public class XmlDoc
{
[DataMember]
public XmlElement doc { get; set; }
}
然后将我的Xelement分配给doc
XmlDoc xml = new XmlDoc();
xml.doc =element;
并将其传递给方法会引发相同的异常。
client.PassXml(element);//Exception
任何解决方案
我的Xml
<Main>
<Product SKU="101091">
<Name>Anchor White Tooth Paste 200Gm</Name>
<Mrp>54.0000</Mrp>
<Price>53.2800</Price>
<Cost>46.0463</Cost>
<Barcode>101091,8904000900457,8904000900501,8904000900624,8904000900631,9910109100017,9910109100727</Barcode>
</Product>
<Product SKU="101094">
<Name>Haldiram's Khari Bundi 40Gm</Name>
<Mrp>10.0000</Mrp>
<Price>9.1287</Price>
<Cost>0.0000</Cost>
<Barcode>101094,9910109400018,9910109400124,9910109401206</Barcode>
</Product>
</Main>
的app.config
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_INopService" closeTimeout="00:10:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:64223/Service.svc"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_INopService"
contract="ServiceReference1.INopService" name="BasicHttpBinding_INopService" />
</client>
</system.serviceModel>
答案 0 :(得分:1)
跟进达林关于使用数据合同的评论,这是一个例子:
[DataContract]
public class Product
{
[DataMember]
public string SKU { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public decimal MRP { get; set; }
[DataMember]
public decimal Price { get; set; }
[DataMember]
public decimal Cost { get; set; }
[DataMember]
List<string> Barcodes { get; set; }
}
然后,您可以将操作签名更改为:
string PassXml(List<Product> products);
但是,您希望传递的数据似乎已经是XML格式,因此另一种选择是执行此操作:
string PassXml(string xml);
然后你可以这样做:
XmlDocument doc = new XmlDocument();
doc.Load(FilePath);
try
{
MyClient client = new MyClient();
client.PassXml(doc.ToString());
client.Close();
}
catch (Exception ex)
{
client.Abort();
// do something about the error
}
然后在您的服务实现中,您可以使用XDocument.Parse()
将字符串转回XDocument
并执行您需要的任何处理。
另请注意,如果您要发送大量数据,则可能超出了服务的某些限制(这也可能会产生400错误)。尝试上述任一建议,如果仍然出现400错误,请发布服务的配置文件。
<强> ADDED 强>
使用第二种方法超出最大字符串内容长度(默认值为8192)时存在风险。我会将maxReceivedMessageSize
,maxBufferSize
(这两者必须相等)以及maxStringContentLength
的约束中的设置增加到更大的值。我建议使用2147483647开始这三个。
答案 1 :(得分:0)
尝试将元素包装在标记中并传递它
postData = @"<string xmlns='http://schemas.microsoft.com/2003/10/Serialization/'><![CDATA[" + your XMLelement + "]]></string>";
基本上<![CDATA[""]]>
会阻止序列化程序将其视为XML。