Failed to get response for large file HTTP put create file using c#

纵饮孤独 提交于 2019-12-02 13:47:58

问题


Failed to get response for large file HTTP put create file using c#

I am using file watcher service service monitor, when user created file or folder we are uploading to cloud

if file size more than 512 MB it is taking too much time to get the response

here I am confusing here the issue with my code or server

and reason for this error

if any changes on my code suggest me.

{
    var fileFolderObj1 = new FileFolder();
    var postURL = apiBaseUri + "/filefolder/create/file/user/" + userId; // +"?type=file";
    code = HttpStatusCode.OK;
    HttpWebResponse response = null;
    FileInfo f = new FileInfo(filePath);
    long filesizeF = f.Length;

    try
    {
        string selectedFile = null;
        selectedFile = filePath;
        var fi = System.IO.Path.GetFileName(filePath);            

        ////commented for some reason
        var postParameters = new Dictionary<string, object>();
        postParameters.Add("file", new FileParameter(filePath,  ""));
        postParameters.Add("parentId", parentId);
        postParameters.Add("newName", fi);
        postParameters.Add("cloudId", cloudId);
        postParameters.Add("isSecure", isSecure);
        //postParameters.Add("fileSize", fi.Length);
        postParameters.Add("fileSize", filesizeF);

        var userAgent = "Desktop";
        var formDataBoundary = "----WebKitFormBoundary" + DateTime.Now.Ticks.ToString("x");

        var uri = new Uri(postURL);
        var createFileRequest = WebRequest.Create(uri) as HttpWebRequest;
        this.SetBasicAuthHeader(createFileRequest, userId, password);
        createFileRequest.ContentType = "multipart/form-data";
        createFileRequest.Method = "PUT";
        createFileRequest.Timeout =  System.Threading.Timeout.Infinite;
        createFileRequest.KeepAlive = false;/*true;*/
        createFileRequest.UserAgent = userAgent;
        createFileRequest.CookieContainer = new CookieContainer();
        try
        {
            using (var requestStream = createFileRequest.GetRequestStream())
            {        
            }

            using (response = (HttpWebResponse)createFileRequest.GetResponse())
            {
                StreamReader(response.GetResponseStream()).ReadToEnd(); 
                fileFolderObj1 = JsonConvert.DeserializeObject<FileFolder>(reslut);
            }                   
        }
        catch (Exception exc)
        {                    
            if (response != null)
            {
                code = response.StatusCode;
            }
        }               
    }
    catch (Exception exc)
    {                
    }
}       
}

    private static readonly Encoding encoding = Encoding.UTF8;

    private void WriteMultipartFormData(Dictionary<string, object> postParameters, string boundary, Stream requestStream, ILogService logService = null)
    { 
        var needsCLRF = false;
        foreach (var param in postParameters)
        {
            // Skip it on the first parameter, add it to subsequent parameters.
            if (needsCLRF)
            {
                requestStream.Write(encoding.GetBytes("\r\n"), 0, encoding.GetByteCount("\r\n"));
            }
            needsCLRF = true;
            if (param.Value is FileParameter)
            {
                var fileToUpload = (FileParameter)param.Value;
                // Add just the first part of this param, since we will write the file data directly to the Stream
                var header = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{2}\"\r\nContent-Type: {3}\r\n\r\n",
                    boundary,
                    param.Key,
                    fileToUpload.FileName ?? param.Key,
                    fileToUpload.ContentType ?? "application/octet-stream");

                requestStream.Write(encoding.GetBytes(header), 0, encoding.GetByteCount(header));
                // Write the file data directly to the Stream, rather than serializing it to a string.
                FileStream fileStream = new FileStream(fileToUpload.FileName, FileMode.Open, FileAccess.Read);

                byte[] buffer = new byte[4096];

                int bytesRead = 0;
                while ((bytesRead = fileStream.Read(buffer, 0,buffer.Length)) != 0)
                {
                    requestStream.Write(buffer, 0, bytesRead);
                    logService.Debug("WRITEMULTIPART FORM DATA Bufferlent Running :{0}", bytesRead);
                }
                fileStream.Close();


            }
            else
            {
                var postData = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"\r\n\r\n{2}",
                    boundary,
                    param.Key,
                    param.Value);
                requestStream.Write(encoding.GetBytes(postData), 0, encoding.GetByteCount(postData));
            }
        }

        // Add the end of the request.  Start with a newline
        var footer = "\r\n--" + boundary + "--\r\n";

        requestStream.Write(encoding.GetBytes(footer), 0, encoding.GetByteCount(footer));

    }
}

来源:https://stackoverflow.com/questions/38432785/failed-to-get-response-for-large-file-http-put-create-file-using-c-sharp

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!