簡體   English   中英

將XElement傳遞給Webservice。遠程服務器返回意外響應:(400)錯誤的WebService請求

[英]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)。 我會在您的綁定中將maxReceivedMessageSizemaxBufferSize (這兩個必須相等)以及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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM