Как вернуть многокомпонентный контент с HTML и XML - PullRequest
0 голосов
/ 18 июня 2019

Мне нужно переписать веб-сервис в .NET Core 2.2, и сервис должен вернуть многокомпонентный ответ с HTML и HTML-кодом в кодировке base-64. Текущий сервис - это действительно старая Java-программа без документации.

Запрос поступил от старой службы, которая не может измениться, и должен получить HTML 4.01 в качестве ответа. Фактический образец показан ниже.

  1. Какой тип объекта ответа я должен вернуть?
  2. Как мне объединить XML и кодированный HTML вместе в один объект ответа?

Я не ожидаю, что кто-нибудь напишет мой код для меня, но я был бы признателен за помощь в начале работы.

Пример ответа

--75df5969-8400-11d5-c000-0021ffffff97
Content-type: text/xml; charset="UTF-8"
Content-id: XMLROOT

<?xml version="1.0" encoding="UTF-8"?><XMLROOT><Service><StatusCd>0</StatusCd></Service></XMLROOT>
--75df5969-8400-11d5-c000-0021ffffff97
Content-type: application/html
Content-id: Inquiry.html
Content-description: Response to View Inquiry

PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+Cgo8SFRNTD4KPEhFQUQ+CjxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgo8TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIj4KCgk8U1RZTEUgVFlQRT0idGV4dC9jc3MiPgoJCVRSIHsgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmV5IH0KCQkudGREYXRhIHsKCSAJCWZvbnQtc2l6ZTo4cHQ7CgkJCWNvbG9yOiMwMDAwOUM7CgkJCWZvbnQtZmFtaWx5OlZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IH0KCQkudGRMYWJlbCB7CgkgCQlmb250LXNpemU6OHB0OwoJCQlmb250LXdlaWdodDpib2xkZXI7CgkJCWZvbnQtZmFtaWx5OlZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IH0KCQkudGRIZWFkIHsKCQkJYmFja2dyb3VuZC1jb2xvcjojODA4MDgwOwoJCQl0ZXh0LWFsaWduOmNlbnRlcjsKCSAJCWZvbnQtc2l6ZTo4cHQ7CgkJCWZvbnQtd2VpZ2h0OmJvbGRlcjsKCQkJZm9udC1mYW1pbHk6VmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgfQoJPC9TVFlMRT4KCjxUSVRMRT5JbnF1aXJ5PC9USVRMRT4KPC9IRUFEPgo8Qk9EWT4KPHRhYmxlIEJPUkRFUj0iMCIgQ0VMTFBBRERJTkc9IjAiIENFTExTUEFDSU5HPSIwIiBXSURUSD0iNzAwIj4KCTx0cj4gCgkJPHRkIEJHQ09MT1I9IiNmZmZmZmYiPgoJCQk8VEFCTEUgQk9SREVSPSIxIiBDRUxMUEFERElORz0iMiIgQ0VMTFNQQUNJTkc9IjEiIFdJRFRIPSI3MDAiPgoJCQkJPFRSPjxURCBDT0xTUEFOPSI0IiBBTElHTj0iY2VudGVyIiBCR0NPTE9SPSIjZmZmZmZmIj4KCQkJCQlUZXN0IG1lc3NhZ2UgCgkJCQk8L1REPjwvVFI+CgkJCTwvVEFCTEU+CQoJCTx0ZD48L3RkPgoJPHRyPjwvdHI+CjwvdGFibGU+Cgo8L0JPRFk+CjwvSFRNTD4=
--75df5969-8400-11d5-c000-0021ffffff97--

1 Ответ

1 голос
/ 19 июня 2019

Какой тип объекта ответа я должен вернуть? Как объединить XML и кодированный HTML вместе в один объект ответа?

Нет такого встроенного типа результата. Однако было бы легко создать пользовательский MultipartResult, который будет содержать XML + HTML (закодированный). Например:

public class XmlAndEncodedHtmlMultipartResult : IActionResult
{
    private StringContent _xmlContent;
    private StringContent _htmlContent;
    private MultipartContent _multipartContent=new MultipartContent(Subtype); // the final content
    public static string Subtype = "my-xml+html" ;                            // `content-type: multipart/{Subtype}`

    public XmlAndEncodedHtmlMultipartResult SetXmlContent(string xml, string contentId = "XMLROOT")
    {
        var xmlContent = new StringContent(xml, Encoding.UTF8, "text/xml");
        xmlContent.Headers.Add("Content-id", contentId);
        this._xmlContent = xmlContent;
        return this;
    }

    public XmlAndEncodedHtmlMultipartResult SetEncodedHtmlContent(string rawHtml,string contentId="Inquiry.html", string description="Response to View Inquiry")
    {
        var bytes= Encoding.UTF8.GetBytes(rawHtml); 
        var encodedHtml = Convert.ToBase64String(bytes);
        var htmlContent = new StringContent(encodedHtml, Encoding.UTF8, "application/html");
        htmlContent.Headers.Add("Content-id", contentId);
        htmlContent.Headers.Add("Content-description",description);
        this._htmlContent = htmlContent;
        return this;
    }

    public async Task ExecuteResultAsync(ActionContext context)
    {
        if(this._htmlContent ==null || this._xmlContent ==null){ throw new Exception("html content & xml must be null");}
        this._multipartContent.Add(this._xmlContent);
        this._multipartContent.Add(this._htmlContent);
        var response = context.HttpContext.Response;
        response.ContentType = this._multipartContent.Headers.ContentType.ToString();
        // ... custom other headers as you like
        await _multipartContent.CopyToAsync(response.Body);
    }
}

В своем действии просто вызовите его, как показано ниже:

public IActionResult Privacy()
{
    var xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><XMLROOT><Service><StatusCd>0</StatusCd></Service></XMLROOT>";
    var html = "<html><head></head><body>hello,world</body></html>";
    return new XmlAndEncodedHtmlMultipartResult().SetEncodedHtmlContent(html).SetXmlContent(xml);
}
...