9

我有一个用 http 和 javascript 编写的肥皂请求,但我似乎无法正确地将其转换为 C#。

原文:(作品)

<button onclick="doStuff()" type="submit">Send</button>

<textarea name="REQUEST_DATA" cols=120 rows=17 >
<?xml version="1.0" encoding="UTF-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<createModifyRequest>
<username>josephs</username>
<lookupIds>
<lookupIds>4225</lookupIds><!--firepass-->
</lookupIds>
</createModifyRequest>
</soap:Body>
</soap:Envelope>
</textarea>

<script language="javascript"> 

function doStuff() {

var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP.3.0");

xmlhttp.open("POST", "http://tpdev-itreq.transpower.co.nz:7777/usr/services/CreateModifyRequest", false);
xmlhttp.setRequestHeader("SOAPAction", "createModifyRequest");

var userpass = "josephs" + ":" + "pass";
xmlhttp.setRequestHeader("Authorization", "Basic " + (userpass));

xmlhttp.setRequestHeader("Content-Type", "text/xml");
xmlhttp.send(REQUEST_DATA.value);

}

在 C# 中转换(不起作用)

private void button1_Click(object sender, EventArgs e)
{
    string soap =@"<?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:Body>
    <createModifyRequest>
        <username>josephs</username>
        <lookupIds>
            <lookupIds>4225</lookupIds>
            <!--firepass-->
       </lookupIds>
    </createModifyRequest>
  </soap:Body>
</soap:Envelope>";

    HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://tpdev-itreq.transpower.co.nz:7777/usr/services/CreateModifyRequest");
    req.Headers.Add("SOAPAction", "\"createModifyRequest\"");

    var userpass = "josephs" + ":" + "pass";

    req.Headers.Add("Authorization", "Basic " + (userpass));
    // req.Headers.Add("Content-Type", "text/xml");

    req.ContentType = "text/xml;charset=\"utf-8\"";
    req.Accept = "text/xml";
    req.Method = "POST";

    using (Stream stm = req.GetRequestStream())
    {
        using (StreamWriter stmw = new StreamWriter(stm))
        {
            stmw.Write(soap);
        }
    }

    WebResponse response = req.GetResponse();

    Stream responseStream = response.GetResponseStream();
    // TODO: Do whatever you need with the response
}

在我运行 C# 代码的那一刻,我得到一个内部 500 服务器错误,那么我做错了什么?

4

2 回答 2

2

我试图重现你的问题。目前我无法创建您的请求,但我已经使用您的数据生成了本地请求。我开始知道的一件事是,如果我删除了 utf-8 周围的双引号(“)并且它工作正常。只需传递charset=utf-8而不是charset=\"utf-8\""

我不确定它是否适合你。

于 2013-06-11T12:48:22.637 回答
2

您是否有理由不能只使用 Visual Studio 对 SOAP Web 服务的内置支持?

您可以添加服务引用Web 引用(取决于您所针对的框架版本)。

然后你可以使用 VS 为你创建的代理类。

自己编写所有 HTTP 代码没有任何好处。实际上,有一个很大的缺点,就是您没有从 SOAP 服务的 WSDL 中获得正确的数据类型。

于 2013-06-16T15:01:03.333 回答