Чтение BLOB-объекта, добавляемого к расширению HTTP, с использованием C# - PullRequest
3 голосов
/ 30 января 2020

Поэтому я использую сторонний сервис, который позволяет мне редактировать мой XML файл, который хранится на пути к серверу. Теперь, когда я закончу редактирование XML, я сохраняю файл в локальном хранилище, которое генерирует BLOB-объект, добавленный к URL-адресу.

Пример:

blob:http://localhost/0e06af7a-a1a9-4bf1-a79a-78a1e107648f

Где 0e06af7a-a1a9-4bf1-a79a-78a1e107648f - токен, созданный для текущего редактирования. Теперь, когда я запускаю вышеупомянутый URL в браузере, я вижу:

enter image description here

Мой вопрос: как я могу прочитать вышеуказанный URL, используя C# и затем сохранить содержимое в объект, который я могу позже использовать для загрузки в файл или облако. Я пытался использовать WebClient:

WebClient client = new WebClient();
Stream stream = client.OpenRead("blob:http://localhost/0e06af7a-a1a9-4bf1-a79a-78a1e107648f");
StreamReader reader = new StreamReader(stream);
string str= reader.ReadToEnd();

Но я получаю сообщение об ошибке, говорящее о том, что URL неверен и должен начинаться с HTTP или HTTPS.

Редактировать: я могу сохранить BLOB-файл в файл, используя JQuery:

var download = $('<a>Download ' + "file.xml" + '</a>').attr("href", "blob:http://localhost/0e06af7a-a1a9-4bf1-a79a-78a1e107648f");
download.attr("download", "file.xml");

Это успешно создает файл с именем file.xml и загружает файл. Я хочу сохранить содержимое этого блоба на стороне сервера, чтобы я мог отправить его в Amazon S3 корзину.

Снова редактирование:

Итак, в настоящее время я сохранил XML в виде строки и пытаюсь отправить его на контроллер C# через AJAX, но работаю в 500 Внутренняя Ошибка Сервера.

        var xmlString = self.xml2Str(self.xmlState.xml);
        //console.log(xmlString);
        var blob = new Blob([xmlString], { type: "text/xml" }); 
        console.log(blob);
        var url = URL.createObjectURL(blob);
        console.log(url);
        var json = {
            xmlString: xmlString
        };

        var test = JSON.stringify(json);
        console.log(test);

        try {
            $.ajax({
                url: BaseURL + "Home/SendXMLToS3",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                data: { "json": test},
                type: "POST",
                success: function (data) {
                    //TODO: Add whatever if you want to pass a notification back
                    alert("Done");
                },
                error: function (error) {
                    //TODO: Add some code here for error handling or notifications
                    alert("Not Done");
                }
            });
        }
        catch (err) {
            console.log(err);
        }

Содержимое переменной test выглядит следующим образом (из консоли):

{"xmlString":"<nitf>\n  <head>\n    <docdata>\n      <identified-content>\n        <classifier id=\"box-geometry\" value=\"147,623,250,790\" />\n        <classifier id=\"uuid\" value=\"Mv8XVAViEeqyc3SUunSxMg\" />\n      </identified-content>\n    </docdata>\n  </head>\n  <body>\n    <body.head />\n    <body.content>\n      <p>\n        <lang fontStyle=\"regular\" style=\".Bodylaser\">How is this different from Pegasus?</lang>\n      </p>\n      <p>\n        <lang fontStyle=\"regular\" style=\".Bodylaser\">Pegasus could be installed on your phone without your knowledge through just a missed WhatsApp video call. In the case of the new breach, a user has to manually download the MP4 file sent to them before any malicious code can be run. The problem is not with WhatsApp’s end-to-end encryption feature here. Getting remote access to your phone is the equivalent of actually holding it in one’s hand. End-to-end encryption is meant to stop attackers from stealing or snooping on chats in between. So, unless someone has access to your device, they can’t actually read your chats, even if they intercept them.</lang>\n      </p>\n    </body.content>\n  </body>\n</nitf>"}

Также попытался установить значение по умолчанию ASP. NET с включенной проверкой запроса по умолчанию для защиты от XSS ложь.

    [HttpPost]
    [ValidateInput(false)]
    public ActionResult SendXMLToS3(string json)

По-прежнему сохраняется ошибка 500: jquery.min.js:4 POST http://localhost/DEGit/Home/SendXMLToS3 500 (Internal Server Error) в методе h.send(c.hasContent&&c.data||null).

Как я могу:

  1. Считайте сгенерированный blob URL-адрес в C#?
  2. Отправьте строку test через AJAX в C#?
  3. Все остальное, что вы, ребята, ребята могу предложить.

Спасибо

1 Ответ

1 голос
/ 30 января 2020

Как вы просили в комментариях: я создал простой контроллер и JS код для использования метода httppost внутри контроллера, используя ajax:

  1. Метод контроллера:
[HttpPost]
public JsonResult SendXMLToS3(string json)
{
    return Json(new { Result = "PASS", Message = "testing SendXMLToS3" });
}
JS код:
<script type="text/javascript">
    function myfunction() {

        var test = { "xmlString": "<nitf>...</nitf>" };
        $.ajax({
            type: "post",
            url: "/Home/SendXMLToS3",
            dataType: "json",
            data: { "json": test },
            success: function (res) {
                alert(res.Message);
            },
            error: function (res) {
                //TODO: Add some code here for error handling or notifications
                alert("Not Done");
            }
        });
    }
</script>

Выводы :
Строка contentType: "application/json; charset=utf-8", вызывала внутреннюю ошибку 500. Если вы удалите ее, вам следует будь в порядке.

...