0

We use a WebMethod on our IIS Webservice, so that users can download a file. Our client runs into an exception when connected to one of our customers webservices, because the key "Content-Length" cannot be found in the header (KeyNotFoundException). The method does work for all other customers. The customer installed a fresh version of Windows Server 2016, one of my colleagues then installed the IIS roles and features. We double and triple checked: the configuration is the same as the one on our internal webservice and as far as we know as on all the webservices other customers run.

After debugging and searching on the internet for the past two days I found out that instead of the "Content-Length" header a header named "Transfer-Encoding" is send, value is "chunked".

It seems that this only occurs when we call the method via POST, but I'm not completely sure about that.

What we have tried so far:

  • Disabling chunked-encoding with this script: cscript adsutil.vbs set /W3SVC/AspEnableChunkedEncoding "TRUE"
  • Disabling chunked-encoding via appcmd: appcmd set config /section:asp /enableChunkedEncoding:False
  • Setting system.webServer/asp/enableChunkedEncoding to false via the iis configuration manager of the server AND the site.

We restarted the whole machine after each of these steps.

IIS Webmethod Code (shortened):

    [WebMethod]
    public void Download(string uniqueID)
    {
        Byte[] data;
        
        var path = GetPath(uniqueID);
        data = File.ReadAllBytes(path);
        if (data != null)
        {
            string sExtension = Path.GetExtension(path);

            string MimeType = GetMIMEType(sExtension);

            HttpContext.Current.Response.ClearContent();
            HttpContext.Current.Response.ClearHeaders();
            HttpContext.Current.Response.ContentType = "application/octet-stream";
            HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + path.Replace(" ", "_"));
            HttpContext.Current.Response.AddHeader("Content-Type", MimeType);
            HttpContext.Current.Response.AddHeader("Content-Length", data.Length.ToString());

            HttpContext.Current.Response.BinaryWrite(data);



            HttpContext.Current.Response.Flush();
            HttpContext.Current.Response.SuppressContent = true;
            HttpContext.Current.ApplicationInstance.CompleteRequest();
        }
}

Client Code (shortened, written in Xamarin.Android as an example, same error occurs on iOS)

            Stream stream = null;
            Java.IO.DataOutputStream dos = null;

            var urlConnection = CreateUrlConnection();

            urlConnection.DoInput = true; // Allow Inputs
            urlConnection.DoOutput = true; // Allow Outputs

            urlConnection.RequestMethod = "POST";
            urlConnection.SetRequestProperty("Content-Type", "application/x-www-form-urlencoded");

            dos = new Java.IO.DataOutputStream(urlConnection.OutputStream);

            string encodedParameters = "";
            bool first = true;
            foreach (Parameter param in parameters)
            {
                if (first)
                    first = false;
                else
                    encodedParameters += "&";

                encodedParameters += HttpUtility.UrlEncode(param.Name);
                encodedParameters += "=";
                encodedParameters += HttpUtility.UrlEncode(param.Value);
            }

            dos.WriteBytes(encodedParameters);

            dos.Flush();
            dos.Close();

            stream = urlConnection.InputStream;

            var header = urlConnection.HeaderFields;
            var bytesToRead = int.Parse(header["Content-Length"][0]); // Exception gets thrown here
Tobe
  • 198
  • 2
  • 13
  • did you try to remove the HttpContext.Current.Response.AddHeader("Content-Length", data.Length.ToString()); from your code? try to disable the dymaic compression in iis. https://stackoverflow.com/questions/3040198/iis7-specifying-content-length-header-in-asp-causes-connection-reset-error – Jalpa Panchal Nov 11 '20 at 02:41
  • Disabling dynamic compression did not solve the problem. I did not remove the "add content-length" part in the IIS code, because this is needed. I dont't think that the content-length will get added automatically if I remove it from code? – Tobe Nov 11 '20 at 07:57
  • capture the network traffic using the fiddler tool. https://www.telerik.com/fiddler – Jalpa Panchal Nov 23 '20 at 06:35

0 Answers0