【问题标题】:IIS 7.5 Restful service returns Error 411 - length required from .net client but not fiddlerIIS 7.5 Restful 服务返回错误 411 - .net 客户端需要长度但不是提琴手
【发布时间】:2013-03-01 23:29:15
【问题描述】:

我正在使用 Microsoft 堆栈:Windows Server 2008 R2 / IIS 7.5; .NET 4.0

在本地主机上设置服务,客户端调用操作顺利。设置服务(最初作为 Post,然后作为 Get)我从 .NET 收到以下错误(方法如下)。如果我直接通过提琴手拨打电话,一切正常,(RAW)标头如下:

HTTP/1.1 200 正常 缓存控制:私有 内容长度:19854411 内容类型:应用程序/xml;字符集=utf-8 服务器:Microsoft-IIS/7.5 X-AspNet-版本:4.0.30319 X-Powered-By:ASP.NET

如果我通过控制台应用程序或 Windows 服务拨打电话,我会收到以下错误 “远程服务器返回错误: 需要长度。”

我有一个 Web 服务,它应该在完成一些工作后返回一个 zip 文件

    [OperationContract]
    [WebInvoke(UriTemplate = "/GetFiles/{profileLocationId}/{batchSize}", Method = "GET", RequestFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare)]
    public byte[] ProfileImagesByProfileId(string profileLocationId, string batchSize)
    {
        //  var watch = new Stopwatch();
        //  watch.Start();
        try
        {
            long id = 0;
            long.TryParse(profileLocationId, out id);

            int size = 200;
            int.TryParse(batchSize, out size);

            var profileRoot = ConfigurationManager.AppSettings["ProfileImageRootDirectory"];
            var fileType = ConfigurationManager.AppSettings["ProfileImageDefaultFileType"];


            var packer = new ImagePackager(profileRoot, fileType);
            if (profileLocationId != null)
            {
                var stream = packer.CompressImages(id, size);

                return stream;
            }
        }
        catch (Exception ex)
        {
            return new byte[0];

        }

        return new byte[0];
    }
}

============================

客户端方法

 static void TimerElapsed(object sender, ElapsedEventArgs e)
    {
        var id = GetLastProfileId();

       // var uri = string.Format("http://{0}/TwitterService/ProfileImages/{1}/{2}", _ipAddress, id, _batchsize);
        var uri = string.Format("http://{0}/Twitter_api/TwitterService/ProfileImages/{1}/{2}", _ipAddress, id, _batchsize);
        GetProfileImagesFromService(uri);
    }


    private static void GetProfileImagesFromService(string uri)
    {
        try
        {
            Console.WriteLine("Process started: {0}", DateTime.Now.ToLongTimeString());
            var request = WebRequest.Create(uri);
            request.Method = "GET";
            request.Timeout = 600000;
            using (var response = (HttpWebResponse)request.GetResponse())
            {
                Console.WriteLine(response.StatusDescription);
                var dataStream = response.GetResponseStream();
                var reader = new StreamReader(dataStream, Encoding.UTF8);
                //  var responseFromServer = reader.ReadToEnd();

                var fileName = string.Format(@"{0}\{1:yyMMddhhmmss}.zip", _targetDirectory, DateTime.UtcNow);
                // File.WriteAllText(fileName, responseFromServer);
                // var xml = XDocument.Parse(responseFromServer);
                var xml = XDocument.Load(reader);
                var base64 = xml.Root.Value.ToCharArray();

                var byteArray = Convert.FromBase64CharArray(base64, 0, base64.Length);

                File.WriteAllBytes(fileName, byteArray);
                Console.WriteLine("GetProfile cycle ended: {0}", DateTime.Now.ToLongTimeString());
            }
        }
        catch (Exception ex)
        {

            Console.WriteLine(ex.Message);
        }
    }

任何指导将不胜感激。

提前谢谢你。

【问题讨论】:

    标签: .net wcf rest iis-7.5


    【解决方案1】:

    HTTP 错误代码 411 表示

    服务器拒绝接受没有定义内容长度的请求。如果客户端在请求消息中添加了包含消息体长度的有效 Content-Length 头字段,则客户端可以重复请求。

    因此,如果您在没有任何正文的情况下调用 HTTP POST 方法,那么只需在标头中的请求对象中添加 Content-Length:0

    【讨论】:

    • 感谢您的回复。我正在做一个 GET 并且 Fiddler 在查看响应的 RAW 选项卡时告诉我我有一个有效的内容长度。 WebInvoke 使这成为一个安静的调用。
    • 如果你注意到了,你会看到 Fiddler 自动在正文内容的基础上添加了content-length 标头。因此,当您从代码中进行调用时,如果没有正文,则可以将其设置为 0。
    【解决方案2】:

    我有一位客户收到 411 错误,结果发现他们安装了 BitDefender 防病毒软件,不知何故导致了该问题。禁用 BitDefender 解决了这个问题。服务器是 Windows Server(2012 或 2016?)和客户端 AngularJS 上的 IIS/ASP.NET。 Chrome 开发工具显示 POST 的 Content-Length: 0 但服务器响应 411 错误,尽管许多其他客户使用它没有问题,但我们以前从未见过。

    因此,如果您偶尔遇到此错误,我建议您寻找可能会中断客户端-服务器通信的防病毒软件、广告拦截器等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      • 2014-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-15
      • 2016-07-03
      相关资源
      最近更新 更多