【问题标题】:C# issue calling EORI SOAP Service调用 EORI SOAP 服务的 C# 问题
【发布时间】:2019-06-30 06:30:32
【问题描述】:

我正在尝试从 C# 应用程序中调用 EORI 验证开放接口,但没有得到任何结果。 我环顾了该站点,似乎没有任何有关如何执行此操作的文档。

网站:http://ec.europa.eu/taxation_customs/dds2/eos/news/newstar.jsp?Lang=en

WSDL:http://ec.europa.eu/taxation_customs/dds2/eos/validation/services/validation?wsdl

我创建了一个新的 C# 控制台应用程序并将 WSDL 添加为服务引用,然后尝试调用该服务但得到以下异常...

System.ServiceModel.CommunicationException: '服务器没有 提供有意义的答复;这可能是由合同引起的 不匹配、会话过早关闭或内部服务器错误。'

我使用了带数字的在线工具,它按预期返回数据 http://ec.europa.eu/taxation_customs/dds2/eos/eori_validation.jsp?Lang=en

还有其他人对此有过好运吗?

谢谢

【问题讨论】:

    标签: c# api web soap


    【解决方案1】:

    感谢您的帮助,如果其他人遇到困难,下面是用于发出和发送请求的帮助类。

    public class EoriModel
        {
            string _url;
    
            public EoriModel()
            {
                _url = "http://ec.europa.eu/taxation_customs/dds2/eos/validation/services/validation";  
            }
    
            public EoriResponseModel ValidateEoriNumber(string number)
            {
                if (number == null)
                {
                    return null;
                }
    
                XmlDocument soapEnvelopeXml = CreateSoapEnvelope(number);
                HttpWebRequest webRequest = CreateWebRequest(_url);
                InsertSoapEnvelopeIntoWebRequest(soapEnvelopeXml, webRequest);
    
                IAsyncResult asyncResult = webRequest.BeginGetResponse(null, null);
                asyncResult.AsyncWaitHandle.WaitOne();
    
                string response;
                using (WebResponse webResponse = webRequest.EndGetResponse(asyncResult))
                {
                    using (StreamReader rd = new StreamReader(webResponse.GetResponseStream()))
                    {
                        response = rd.ReadToEnd();
                    }
                }
    
                int startPos = response.IndexOf("<return>");
                int lastPos = response.LastIndexOf("</return>") - startPos + 9;
                string responseFormatted = response.Substring(startPos, lastPos);
    
                XmlSerializer serializer = new XmlSerializer(typeof(EoriResponseModel));
                EoriResponseModel result; 
    
                using (TextReader reader = new StringReader(responseFormatted))
                {
                    result = (EoriResponseModel)serializer.Deserialize(reader);
                }
    
                return result;
            }
    
            private static HttpWebRequest CreateWebRequest(string url)
            {
                HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
                webRequest.ContentType = "text/xml;charset=\"utf-8\"";
                webRequest.Accept = "text/xml";
                webRequest.Method = "POST";
                return webRequest;
            }
    
            private static XmlDocument CreateSoapEnvelope(string number)
            {
                XmlDocument soapEnvelopeDocument = new XmlDocument();
                StringBuilder xmlBuilder = new StringBuilder();
                xmlBuilder.AppendFormat("<soap:Envelope xmlns:soap={0} >", "'http://schemas.xmlsoap.org/soap/envelope/'");
                xmlBuilder.Append("<soap:Body>");
                xmlBuilder.AppendFormat("<ev:validateEORI xmlns:ev={0} >", "'http://eori.ws.eos.dds.s/'");
                xmlBuilder.AppendFormat("<ev:eori>{0}</ev:eori>", number);
                xmlBuilder.Append("</ev:validateEORI>");
                xmlBuilder.Append("</soap:Body> ");
                xmlBuilder.Append("</soap:Envelope> ");
    
                soapEnvelopeDocument.LoadXml(xmlBuilder.ToString());
                return soapEnvelopeDocument;
            }
    
            private static void InsertSoapEnvelopeIntoWebRequest(XmlDocument soapEnvelopeXml, HttpWebRequest webRequest)
            {
                using (Stream stream = webRequest.GetRequestStream())
                {
                    soapEnvelopeXml.Save(stream);
                }
            }
        }
    

    以及用于解析结果的带有注解的类

    [XmlRoot(ElementName = "return")]
        public class EoriResponseModel
        {
            [XmlElement(ElementName = "requestDate")]
            public string RequestDate { get; set; }
            [XmlElement(ElementName = "result")]
            public List<Result> Result { get; set; }
        }
    
        [XmlRoot(ElementName = "result")]
        public class Result
        {
            [XmlElement(ElementName = "eori")]
            public string Eori { get; set; }
            [XmlElement(ElementName = "status")]
            public string Status { get; set; }
            [XmlElement(ElementName = "statusDescr")]
            public string StatusDescr { get; set; }
            [XmlElement(ElementName = "name")]
            public string Name { get; set; }
            [XmlElement(ElementName = "street")]
            public string Street { get; set; }
            [XmlElement(ElementName = "postalCode")]
            public string PostalCode { get; set; }
            [XmlElement(ElementName = "city")]
            public string City { get; set; }
            [XmlElement(ElementName = "country")]
            public string Country { get; set; }
        }
    

    【讨论】:

      【解决方案2】:

      如果您在打开 EORI 验证方法的定义时打开的 Reference.cs 文件深处的 URI 进行谷歌搜索,那么您会发现此页面上的某个人 https://www.codeproject.com/Questions/1075553/Soap-Message-Format-Issue-while-accessing-webservi 遇到了同样的问题。

      在那个页面上,他引用了他用来进行查询的示例代码。

      <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
       <soap:Body> 
      <ev:validateEORI xmlns:ev="http://eori.ws.eos.dds.s/"> 
      <ev:eori>DE123456</ev:eori> 
      <ev:eori>IT123456789</ev:eori> 
      </ev:validateEORI> 
      </soap:Body> 
      </soap:Envelope> 
      

      在 Postman 中尝试此代码,并享受结果。 :D

      他的疑问最终是他编写的 C# 代码没有创建有效的 XML,但至少该 XML 会从 API 中为您获取结果,以便您的测试/开发过程继续进行。

      【讨论】:

      • 为找到答案干杯马克 R ;)
      • 谢谢 - 设法让它工作,看起来包装类和 C# 不能很好地工作。当您手动构建 SOAP 请求时,它会按预期工作。谢谢
      • 我在看到这个答案之前试过这个,但它不起作用。事实证明,如果您指定内容类型,您将收到错误 414“不支持的媒体类型”。省略此标头时效果很好
      猜你喜欢
      • 2014-12-30
      • 2023-03-14
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-27
      • 2019-12-25
      相关资源
      最近更新 更多