将XElement传递给Webservice。远程服务器返回了意外响应:(400)Bad Request WebService

时间:2013-12-26 08:56:59

标签: asp.net wcf web-services

我正在研究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>

2 个答案:

答案 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)时存在风险。我会将maxReceivedMessageSizemaxBufferSize(这两者必须相等)以及maxStringContentLength的约束中的设置增加到更大的值。我建议使用2147483647开始这三个。

答案 1 :(得分:0)

尝试将元素包装在标记中并传递它

postData = @"<string xmlns='http://schemas.microsoft.com/2003/10/Serialization/'><![CDATA[" + your XMLelement + "]]></string>";

基本上<![CDATA[""]]>会阻止序列化程序将其视为XML。

相关问题