[英]The remote server returned an unexpected response: (400) Bad Request. wcf
[英]Passing XElement to Webservice .The remote server returned an unexpected response: (400) Bad Request WebService
我正在使用webservice。我想將XmlDocument傳遞給webservice中的方法,但是請閱讀文章之一以傳遞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>
為了跟進達林關於使用數據合約的評論,下面是一個示例:
[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錯誤,請發布服務的配置文件。
添加
使用第二種方法可能會超出最大字符串內容長度(默認值為8192)。 我會在您的綁定中將maxReceivedMessageSize
, maxBufferSize
(這兩個必須相等)以及maxStringContentLength
增加到更大的值。 我建議使用2147483647為所有這三個開始。
嘗試將元素包裝在標簽中並傳遞
postData = @"<string xmlns='http://schemas.microsoft.com/2003/10/Serialization/'><![CDATA[" + your XMLelement + "]]></string>";
基本上<![CDATA[""]]>
停止序列化程序將其視為XML。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.