VB .Net: Json не возвращается, используя ASHX - PullRequest
0 голосов
/ 14 октября 2019

У меня проблема с моим кодом, не возвращающим ответ Json. Я никогда не создавал API с использованием ASHX раньше. Я проверил свою строку Json, которая создается, и она кажется хорошей.

Возвращенный сериализованный JSON выглядит следующим образом:

"{""Error"":""Error: Import: Unknown SKU Received!""}" 

Это правильное сообщение, которое должно быть возвращено. Вместо этого я получаю Bad Request в качестве ответа. Не генерирует никаких ошибок на моей стороне кода.

Фрагмент кода:

Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
    Dim oImporter As Importer
    Dim oResponse As Domain.Structures.Structures.ReturnResponse
    Dim Input_sr As StreamReader
    Dim sData As String
    Dim bolError As Boolean = False
    Dim obj As New Domain.Models.Order.Order
    Dim sError As New order_response_error
    Dim sResponse As New order_response_success

    Try
        Input_sr = New StreamReader(context.Request.InputStream)
        sData = Input_sr.ReadToEnd
        Input_sr.Close()

        If context.Request.ContentType.StartsWith("application/json") Then
            obj = JsonConvert.DeserializeObject(Of Domain.Models.Order.Order)(sData)
            If obj.api_key = ConfigurationManager.AppSettings("api_key") Then
                oImporter = New Importer(sData)
                oResponse = oImporter.ImportOrder
                context.Response.StatusCode = HttpStatusCode.OK

                If oResponse.ReturnCode = "Error" Then
                    bolError = True
                    context.Response.StatusCode = HttpStatusCode.BadRequest
                    sError.Error = oResponse.ReturnCode + ": " + oResponse.Message
                    'sError.Error = String.Format(oResponse.ReturnCode, oResponse.Message)
                Else
                    context.Response.StatusCode = HttpStatusCode.OK
                    sResponse.vendor_order_id = oResponse.Message
                End If
            Else
                bolError = True
                context.Response.StatusCode = HttpStatusCode.Unauthorized
                sError.Error = "Error: Access Denied"
                'sError.Error = String.Format("Error", "Access Denied")
            End If
        Else
            bolError = True
            context.Response.StatusCode = HttpStatusCode.BadRequest
            sError.Error = "Error: Invalid content type"
            'sError.Error = String.Format("Error", "Invalid content type")
        End If
    Catch ex As Exception
        bolError = True
        context.Response.StatusCode = HttpStatusCode.BadRequest
        Utils.ErrorEmail("Order Error!", ex, AttachmentName:="Order.xml", AttachmentData:=sData)
        sError.Error = String.Format("Error", ex.Message)
    End Try

    context.Response.ContentType = "application/json"

    If bolError Then
        context.Response.Write(JsonConvert.SerializeObject(sError))
    Else
        context.Response.Write(JsonConvert.SerializeObject(sResponse))
    End If
End Sub

Ответ об ошибке от клиента:

Ошибка: Cache-Control:
private Content-Type: application / json;кодировка = UTF-8 Сервер: Microsoft-IIS / 10,0 X-Сеть САШ-версия: 4.0.30319 X-исходников,: = UTF-8 В XFxhd2FyZGdyYXBoaWNzLmNvbVxkYXRhXFVzZXJzXG1ob2xtZXNcRGVza3RvcFxDb2xsYWdlXENvbGxhZ2VcQ29sbGFnZS5XZWIuUG9ydGFsXGFwaVx0ZXN0b3JkZXIxLmFzaHg = X-Powered-By:?? ASP.NET Access-Control-Allow-Origin: * Access-Control-Allow-Methods:
GET, POST, OPTIONS Access-Control-Allow-Headers: X-Requested-With, Тип содержимого Дата:
Пн, 14 октября 2019 г. 14:47:57 GMT Контент-длина: 48 байт ЗАВЕРШИТЕ ЗАПРОСИТЕ ЗАГОЛОВКИ pretty Sec-Fetch-Mode: cors Источник: chrome-extension: // aejoelaoggembcahagimdiliamlcdmfm Пользователь-агент: Mozilla / 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit / 537.36 (KHTML, как Gecko) Chrome / 77.0.3865.90 Safari / 537.36 Тип содержимого: application / json Принято: / Sec-Fetch-Site: межсайтовый Accept-Encoding: gzip, deflate, br Accept-Language: en-US, en; q = 0,9 Cookie: AspxAutoDetectCookieSupport = 1

1 Ответ

1 голос
/ 14 октября 2019

В вашем коде есть только одно место, куда вы возвращаете пользовательское сообщение с сервера, и с помощью «BadRequest» в следующих строках:

context.Response.StatusCode = HttpStatusCode.BadRequest
sError.Error = oResponse.ReturnCode + ": " + oResponse.Message

Это означает, что ваша бизнес-логика возвращает это (Я не могу сказать соответственно или нет). Вам нужно проследить через бизнес-логику, чтобы найти логику, которая представляет неверное сообщение SKU. С этой точки зрения ASHX выглядит корректно.

...