Ответы MutiPart, усеченные в ASP.NET - PullRequest
0 голосов
/ 01 июля 2019

У меня есть действие ASP.NET, которое возвращает ответ MultiPart.Когда детали очень маленькие, они работают нормально, но когда содержание деталей увеличивается в размерах, ответ усекается в случайных точках.Я подозреваю, что это относится к копии потока в ответе, но не уверен, как это преодолеть.Может кто-нибудь помочь?

Вот некоторый контекст:

Это пример основного действия, показывающий, как составляется ответ и как он записывается в ответ

public ActionResult Index()
{
    // Create content object to hold all ready parts. This is the actual response object
    var content = new System.Net.Http.MultipartContent("byteranges", "multipart yo");

    // Get all the parts to be sent
    var partsArray = new MultipartContent[] {
        GetHtmlPart(),
        GetCssPart(),
        GetJsPart()
    };

    // Add each part to the response
    foreach (var item in partsArray)
    {
        if (item.Stream != null)
        {
            // Get part byte stream to add to the response
            var partContent = new StreamContent(item.Stream);

            // Set mime type
            if (item.ContentType != null)
            {
                partContent.Headers.ContentType = new MediaTypeHeaderValue(item.ContentType);
            }

            // Set name information
            if (item.FileName != null)
            {
                var contentDisposition = new ContentDispositionHeaderValue("attachment")
                {
                    FileName = item.FileName
                };

                partContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
                {
                    FileName = contentDisposition.FileName,
                    FileNameStar = contentDisposition.FileNameStar
                };
            }

            content.Add(partContent);
        }
    }

    // send multipart contents with all part data to the response stream which is sent to the client
    content.CopyToAsync(Response.OutputStream);

    // set the HTTP content type header for response
    Response.ContentType = content.Headers.ContentType.ToString();

    // add allowance for CORS
    Response.Headers.Add("Access-Control-Allow-Origin", "*");

    // return setting the HTTP status code. In this case, 200 == OK
    return new HttpStatusCodeResult(HttpStatusCode.OK);
}

Каждая часть добавляется в аналогичном порядке, вот пример ...

private MultipartContent GetHtmlPart()
{
    // Get content to be sent
    var content = GetHtmlContent();

    // Convert to bytes since that is what we will send to client as
    var bytes = Encoding.ASCII.GetBytes(content);

    // Package as multi-part segment, and describe the mime details
    var part = new MultipartContent()
    {
        ContentType = "text/plain",
        FileName = "File.html",
        Stream = new MemoryStream(bytes)
    };

    return part;
}
...