【问题标题】:Send xml with a post request to wcf service on iis将带有 post 请求的 xml 发送到 iis 上的 wcf 服务
【发布时间】:2015-07-03 15:06:58
【问题描述】:

已解决this link

我正在开发一个带有休息模式的 wcf 服务。现在它位于 IIS 服务器上。

它有一个可通过帖子调用的方法,该方法必须接收 xml 数据。

我正在尝试发送此 xml(带有其他参数),但我只收到反序列错误:

in System.ServiceModel.Dispatcher.OperationFormatter.DeserializeRequest(Message message, Object[] parameters)

in System.ServiceModel.Dispatcher.DemultiplexingDispatchMessageFormatter.DeserializeRequest(Message message, Object[] parameters)

in System.ServiceModel.Dispatcher.UriTemplateDispatchFormatter.DeserializeRequest(Message message, Object[] parameters)

in System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs(MessageRpc& rpc)

in System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)

in System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)

in System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc)

in System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

这是请求:

retista=0019&hashedStrig=dkfjdkfjd&dati=<ArrayOfWrapClienti xmlns="http://schemas.datacontract.org/2004/07/MultipayOnline" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><WrapClienti><CODRETE>0018</CODRETE><CODICE>20685</CODICE><NOME>A.T.E.R. Azienda Territoriale</NOME><INDIRIZZO>PIAZZA POZZA</INDIRIZZO><CITTA>Verona</CITTA><CAP>37123</CAP><PROV>VR</PROV><CODICEFISCALE>00223640236</CODICEFISCALE><PIVA>223640236</PIVA><EMAIL/><ESPOSIZ_CONTABILE>937,02</ESPOSIZ_CONTABILE><STATO>FALSE</STATO></WrapClienti></ArrayOfWrapClienti>

这是我要发送的 xml:

<ArrayOfWrapClienti xmlns="http://schemas.datacontract.org/2004/07/aaa" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<WrapClienti>
<CODRETE>1111</CODRETE>
<CODICE>111</CODICE>
<NOME>AAA</NOME>
<INDIRIZZO>PIAZZA</INDIRIZZO>
<CITTA>AAA</CITTA>
<CAP>111</CAP>
<PROV>aa</PROV>
<CODICEFISCALE>111</CODICEFISCALE>
<PIVA>223611140236</PIVA>
<EMAIL/>
<ESPOSIZ_CONTABILE>1111</ESPOSIZ_CONTABILE>
<STATO>FALSE</STATO>
</WrapClienti>
</ArrayOfWrapClienti>

如果你点击here,你会发现我的wcf是如何返回一个xml的。我以为我必须将相同的 xml 与其他数据一起发送,但我得到了反序列化错误。

为什么?

如何将 xml 发送到我的 wcf?在这个测试阶段,我使用的是this

如果我可以给你其他有用的信息,问我,我会写在这里。

更新:错误消息的文本说在根级别,第 1 行,位置 1 存在无效数据。另外,如果我把

<?xml version="1.0" encoding="utf-8" ?>

在根级别。

可能缺少一些标题?

更新服务器端

这是我的服务器 wcf 的配置方式:

    [OperationContract]
    [WebGet(UriTemplate = "cliente.xml?retista={codret}&cliente={codiceCliente}&H={hashedString}", ResponseFormat = WebMessageFormat.Xml)]
    List<WrapClienti> GetClienteXML(string codret, string codiceCliente, string hashedString);

这是被调用的方法:

    public GenericResponse SetClientiXML(List<WrapClienti> clienti, string retista, string hashedString) 
    {
        var api = new API();
        return api.SetClienti(clienti, retista, hashedString);        
    }

如您所见,我不管理任何 xml/json 反序列化阶段,它由 wcf 例程管理。例如,如果我发送一个 json 列表,它会将其转换为一个列表。这也是我想看到的 xml,但我在这个问题的顶部得到了错误。

另一个更新:我必须在 xml 中发送 3 个参数,所以....这是我最后一次尝试,我认为它比以前更正确。现在服务器给出空引用错误:

<?xml version="1.0" encoding="utf-8" ?>
<SetClientiXML
  xmlns="http://tempuri.org/">
  <XMLRequest>
    <ArrayOfWrapClienti
      xmlns="http://schemas.datacontract.org/2004/07/aaa"
      xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
      <WrapClienti>
        <CODRETE>111</CODRETE>
        <CODICE>111</CODICE>
        <NOME>aaa</NOME>
        <INDIRIZZO>aaa</INDIRIZZO>
        <CITTA>aaa</CITTA>
        <CAP>aaa</CAP>
        <PROV>aa</PROV>
        <CODICEFISCALE>111</CODICEFISCALE>
        <PIVA>2236401111236</PIVA>
        <EMAIL/>
        <ESPOSIZ_CONTABILE>111</ESPOSIZ_CONTABILE>
        <STATO>FALSE</STATO>
      </WrapClienti>
    </ArrayOfWrapClienti>
    <RETISTA>1111</RETISTA>
    <HASHEDSTRING>oklkokokokok</HASHEDSTRING>
  </XMLRequest>
</SetClientiXML>

我也创建了这个类:

[DataContract]
public class XMLRequest
{
    [DataMember]
    public List<WrapClienti> XML;
    [DataMember]
    public string RETISTA;
    [DataMember]
    public string HASHEDSTRING;
    public XMLRequest() { }
    public XMLRequest(List<WrapClienti> x, string r, string h)
    {
        this.HASHEDSTRING = h;
        this.XML = x;
        this.RETISTA = r;
    }
}

现在的portotype是:

public GenericResponse SetClientiXML(XMLRequest xr)

【问题讨论】:

  • 您提供的链接顶部似乎有一个空白行。 xml 标识行必须从文件中的第一个字符开始。
  • @jdweng 空行?在哪里?我没有空行
  • where 链接似乎有一个空白的第一行。您发布的代码也缺少第一行
  • @jdweng xml 是自动生成的,我返回一个对象列表并且 wcf 构建 xml ......我该怎么办?我不写那个xml
  • 你得到的完整例外是什么?您只发布了堆栈跟踪。

标签: c# xml wcf rest iis


【解决方案1】:

这行得通吗?

            string input =
                "<ArrayOfWrapClienti xmlns=\"http://schemas.datacontract.org/2004/07/MultipayOnline\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">" +
                "<WrapClienti>" +
                "<CODRETE>0018</CODRETE>" +
                "<CODICE>20685</CODICE>" +
                "<NOME>A.T.E.R. Azienda Territoriale</NOME>" +
                "<INDIRIZZO>PIAZZA POZZA</INDIRIZZO>" +
                "<CITTA>Verona</CITTA>" +
                "<CAP>37123</CAP>" +
                "<PROV>VR</PROV>" +
                "<CODICEFISCALE>00223640236</CODICEFISCALE>" +
                "<PIVA>223640236</PIVA>" +
                "<EMAIL/>" +
                "<ESPOSIZ_CONTABILE>937,02</ESPOSIZ_CONTABILE>" +
                "<STATO>FALSE</STATO>" +
                "</WrapClienti>" +
                "</ArrayOfWrapClienti>";

            input = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + input;​

【讨论】:

  • XML 很好。你是如何反序列化的?需要确定捕获的xml是否与发送xml相同。
  • 看更新...它是一个 wcf 服务,我不管理服务器端的 xml 读取...它由 wcf 本身管理,所以我不知道我在哪里可以制作模组。
  • 可能缺少一些标题?
  • 你可以使用像wireshark或fiddler这样的嗅探器来检查ip消息
  • 我看到这些标头: HEADERS Access-Control-Allow-Origin: * Cache-Control: private Content-Length: 3046 Content-Type: text/html Date: Mon, 06 Jul 2015 11:13 :55 GMT 服务器:Microsoft-IIS/8.0 X-Aspnet-版本:4.0.30319 X-Powered-By:ASP.NET
【解决方案2】:

这是序列化和反序列化 xml 的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
using System.Xml.Serialization;

namespace ConsoleApplication2
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            SetClientiXML client = new SetClientiXML()
            {
                xmlRequest = new XMLRequest()
                {
                    arrayOfWrapClienti = new ArrayOfWrapClienti()
                    {
                        wrapClient = new List<WrapClient>() {
                            new WrapClient {
                                codrete = "0018",
                                codice = "20685",
                                nome = "A.T.E.R. Azienda Territoriale",
                                indirizzo = "PIAZZA POZZA",
                                citta = "Verona",
                                cap = "37123",
                                prov = "VR",
                                codiceFiscale = "00223640236",
                                piva = "223640236",
                                esposizContabile = "937,02",
                                stato = false
                            }
                        }
                    }
                },
                retista = "3303903",
                hashedString = "oklkokokokok"
            };

            XmlSerializer serializer = new XmlSerializer(typeof(SetClientiXML));

            StreamWriter writer = new StreamWriter(FILENAME);
            serializer.Serialize(writer, client);
            writer.Flush();
            writer.Close();
            writer.Dispose();

            XmlSerializer xs = new XmlSerializer(typeof(SetClientiXML));
            XmlTextReader reader = new XmlTextReader(FILENAME);
            SetClientiXML newClient = (SetClientiXML)xs.Deserialize(reader);
        }

    }

    [XmlRoot("SetClientiXML")]
    public class SetClientiXML
    {
        [XmlElement("XMLRequest")]
        public XMLRequest xmlRequest { get; set; }
        [XmlElement("RETISTA")]
        public string retista { get; set; }
        [XmlElement("HASHEDSTRING")]
        public string hashedString { get; set; }
    }

    [XmlRoot("XMLRequest")]
    public class XMLRequest
    {
        [XmlElement("ArrayOfWrapClienti")]
        public ArrayOfWrapClienti arrayOfWrapClienti { get; set; }
    }

    [XmlRoot("ArrayOfWrapClienti")]
    public class ArrayOfWrapClienti
    {
        [XmlElement("WrapClient")]
        public List<WrapClient> wrapClient { get; set; }
    }

    [XmlRoot("WrapClient")]
    public class WrapClient
    {
        [XmlElement("CODRETE")]
        public string codrete { get; set; }
        [XmlElement("CODICE")]
        public string codice { get; set; }
        [XmlElement("NOME")]
        public string nome { get; set; }
        [XmlElement("INDIRIZZO")]
        public string indirizzo { get; set; }
        [XmlElement("CITTA")]
        public string citta { get; set; }
        [XmlElement("CAP")]
        public string cap { get; set; }
        [XmlElement("PROV")]
        public string prov { get; set; }
        [XmlElement("CODICEFISCALE")]
        public string codiceFiscale { get; set; }
        [XmlElement("PIVA")]
        public string piva { get; set; }
        [XmlElement("EMAIL")]
        public string email { get; set; }
        [XmlElement("ESPOSIZ_CONTABILE")]
        public string esposizContabile { get; set; }
        [XmlElement("STATO")]
        public Boolean stato { get; set; }

    }
}
​

【讨论】:

  • 您曾经使用过 wcf rest 吗?它由 wcf 本身管理......对我来说,问题是找到构建 xml 的正确方法,但它是管理的......对于 json 也是一样的......类是一样的! :)
  • 看这个...我的新问题与更新的问题..stackoverflow.com/questions/31262596/…我希望它很清楚
  • 你的类是 xml 特定的,而我想使用对 xml 和 json 都有效的类
猜你喜欢
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 2014-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-17
  • 1970-01-01
相关资源
最近更新 更多