1

マルチパートMIME、つまり添付ファイル付きの石鹸を送信するスクリプトがあります。私はC#httpWebRequestクラスを使用しています。コンテンツの長さが必要であるというエラーが表示されますが、webrequestのcontentLengthプロパティを使用してコードでコンテンツの長さを動的に設定しています。なぜこれができるのか、何か考えはありますか?ありがとう!これはコードです:

public void sendSOAPoverHttpVoda()
{
    try
    {
        string xmlDoc = this.soapXml;
        byte[] bytes;
        bytes = Encoding.UTF8.GetBytes(xmlDoc);
        long contentSize = bytes.Length;

        HttpWebRequest req =  (HttpWebRequest)WebRequest.Create(conectionUrl);
        req.SendChunked = true;
        CredentialCache credentialCacheObj = new CredentialCache();
        credentialCacheObj.Add(
            new Uri(conectionUrl),
            "Basic", new NetworkCredential("dddfff", "dddddd"));
        credentialCacheObj.Add(new Uri(conectionUrl), "Digest", new NetworkCredential("dddfff", "dddddd"));

        req.Credentials = credentialCacheObj;
        req.Method = "POST";
        req.ProtocolVersion = HttpVersion.Version11;

        req.ContentLength = xmlDoc.Length;
        req.ContentType = "multipart/related; boundary=\"----=cellsmart_mm7_SOAP\";type=\"text/xml\";Start=\"</cellsmart_mm7_submit>\"";
        req.AllowWriteStreamBuffering = true;

        req.Timeout = 20000;
        req.Headers.Add("SOAPAction", "");
        //req.Connection = "";

        if (bytes != null)
        {
            using (Stream outputStream = req.GetRequestStream())
            {
                outputStream.Write(bytes, 0, xmlDoc.Length);
            }
        }
        using (HttpWebResponse response = (HttpWebResponse)req.GetResponse())
        {
            Stream responseStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(responseStream);
            string responseText = reader.ReadToEnd();
            Console.WriteLine("Response received from URI : " + responseText);
            Console.ReadLine();
        } 

        Console.ReadLine();
    }
    catch (Exception ex)
    {
        Console.WriteLine("Error : " + ex.Message + "\n" + ex.StackTrace);
        Console.ReadLine();
    }
}

私が得るエラー/例外は必要な長さです(411)

4

2 に答える 2

1

SendChunked=trueとContentLengthの両方を使用することはできません。最も簡単な方法は、チャンク化された応答を使用し、ContentLengthを省略することです。必要に応じて、ContentLengthを保持し、SendChunkedを省略することもできます。

あなたがそれに精通していない場合のために、ウィキペディアはチャンキングの素晴らしい説明を持っています。

于 2012-04-19T13:20:20.560 に答える
0

送信するbyte[]の長さ('bytes')としてcontentLengthを宣言してから、コンテンツの長さとしてxmlDocの長さを使用します。これにより、実際とは異なる長さが得られます。次に、outputStream.Writeで同じxmlDoc.Lengthを使用します。

どちらの場合もbytes.Lengthを使用しないのはなぜですか?または、宣言したが使用したことのないcontentLengthが問題だと思います。これは、bytes.Length(文字列から変換されたバイト配列の長さ)に対してxmlDoc.Length(文字列の長さ)を送信しているためです。送信された長さで予想よりも長い場合、エラーが返されます。

これを試して:

    public void sendSOAPoverHttpVoda()
    {
    try
    {
    string xmlDoc = this.soapXml;
    byte[] bytes;
    bytes = Encoding.UTF8.GetBytes(xmlDoc);

    HttpWebRequest req =  (HttpWebRequest)WebRequest.Create(conectionUrl);
    req.SendChunked = true;
    CredentialCache credentialCacheObj = new CredentialCache();
    credentialCacheObj.Add(
        new Uri(conectionUrl),
        "Basic", new NetworkCredential("dddfff", "dddddd"));
    credentialCacheObj.Add(new Uri(conectionUrl), "Digest", new NetworkCredential("dddfff", "dddddd"));

    req.Credentials = credentialCacheObj;
    req.Method = "POST";
    req.ProtocolVersion = HttpVersion.Version11;

    req.ContentLength = bytes.Length;
    req.ContentType = "multipart/related; boundary=\"----=cellsmart_mm7_SOAP\";type=\"text/xml\";Start=\"</cellsmart_mm7_submit>\"";
    req.AllowWriteStreamBuffering = true;

    req.Timeout = 20000;
    req.Headers.Add("SOAPAction", "");
    //req.Connection = "";

    if (bytes != null)
    {
        using (Stream outputStream = req.GetRequestStream())
        {
            outputStream.Write(bytes, 0, bytes.Length);
        }
    }
    using (HttpWebResponse response = (HttpWebResponse)req.GetResponse())
    {
        Stream responseStream = response.GetResponseStream();
        StreamReader reader = new StreamReader(responseStream);
        string responseText = reader.ReadToEnd();
        Console.WriteLine("Response received from URI : " + responseText);
        Console.ReadLine();
    } 

    Console.ReadLine();
}
catch (Exception ex)
{
    Console.WriteLine("Error : " + ex.Message + "\n" + ex.StackTrace);
    Console.ReadLine();
}

}

于 2013-02-01T19:19:52.000 に答える