Почему при использовании SoapParameterStyle.Bare выдается ошибка 500 Internal Server? - PullRequest
0 голосов
/ 01 февраля 2020

Мой веб-сервис ASMX принимает SumObject, содержащий два числа, и возвращает их общую сумму в объекте SumResult.

Веб-служба:

  [WebService(Namespace = "http://sample.com/sub/")]
  [WebServiceBinding(ConformsTo = WsiProfiles.None)]
  [System.ComponentModel.ToolboxItem(false)]
  [System.Web.Script.Services.ScriptService]    
  public class Service : System.Web.Services.WebService
  {
    [WebMethod]
    public SumResult SumTogether(SumObject MySum)
    {
      SumResult result = new SumResult();
      result.total = MySum.a + MySum.b;
      return result;
    }
  }

  public class SumObject
  {
    public int a;
    public int b;
  }

  public class SumResult
  {
    public int total;
  }

Клиент SOAP Вызов:

    static void TestSumTogether()
    {
      try
      {
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://.../Service.asmx");

        req.Headers.Add("SOAP:Action");
        req.ContentType = "text/xml;charset=\"utf-8\"";
        req.Accept = "text/xml";
        req.Method = "POST";

        XmlDocument xml = new XmlDocument();

        xml.LoadXml("<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
                    "<SOAP:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:SOAP=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
                    "<SOAP:Header />" +
                    "<SOAP:Body>" +
                    "<SumTogether xmlns=\"http://sample.com/sub/\">" +
                    "<MySum>" +
                    "<a>5</a>" +
                    "<b>6</b>" +
                    "</MySum>" +
                    "</SumTogether>" +
                    "</SOAP:Body>" +
                    "</SOAP:Envelope>");

        using (Stream st = req.GetRequestStream())
        {
          xml.Save(st);
        }

        using (WebResponse res = req.GetResponse())
        {
          using (StreamReader sr = new StreamReader(res.GetResponseStream()))
          {
            string result = sr.ReadToEnd();
            Console.WriteLine(result);
          }
        }
      }
      catch (Exception ex)
      {
        Console.WriteLine("Error: " + ex.Message + "\n" + ex.StackTrace);
      }
    }

Результат:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <SumTogetherResponse xmlns="http://sample.com/sub/">
      <SumTogetherResult>
        <total>11</total>
      </SumTogetherResult>
    </SumTogetherResponse>
  </soap:Body>
</soap:Envelope>

Однако в ответе Я хочу удалить узел и переименовать узел в , чтобы он соответствовал имени класса объекта, поэтому перед веб-методом я добавил следующее:

    [SoapDocumentMethod(ParameterStyle = SoapParameterStyle.Bare)]
    [return: XmlElement("SumResult")]

Однако теперь Я получаю ошибку ниже и не могу найти решение. Пожалуйста, помогите мне определить, что я пропускаю.

Error: The remote server returned an error: (500) Internal Server Error.
   at System.Net.HttpWebRequest.GetResponse()
   at MyProject.Program.TestSumTogether()
...