【问题标题】:VB .Net: Json not returning using ASHXVB .Net:Json 不使用 ASHX 返回
【发布时间】:2020-02-11 05:02:24
【问题描述】:

我的代码没有返回 Json 响应时遇到问题。我以前从未使用 ASHX 构建过 API。我检查了正在创建的 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

来自客户端的错误响应:

错误: 缓存控制:
私人的 内容类型:应用程序/json;字符集=utf-8 服务器:Microsoft-IIS/10.0 X-AspNet-版本:4.0.30319 X-SourceFiles:=?UTF-8?B?XFxhd2FyZGdyYXBoaWNzLmNvbVxkYXRhXFVzZXJzXG1ob2xtZXNcRGVza3RvcFxDb2xsYWdlXENvbGxhZ2VcQ29sbGFnZS5XZWIuUG9ydGFsXGFwaVx0ZXN0b3=JkZXIg X-Powered-By: ASP.NET 访问控制允许来源:* 访问控制允许方法:
获取、发布、选项 Access-Control-Allow-Headers: X-Requested-With,Content-Type 日期:
格林威治标准时间 2019 年 10 月 14 日星期一 14:47:57 内容长度:48 字节 完整的请求标头 漂亮 Sec-Fetch-Mode: cors 来源:chrome-extension://aejoelaoggembcahagimdiliamlcdmfm 用户代理:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36 内容类型:应用程序/json 接受:/ Sec-Fetch-Site:跨站点 接受编码:gzip、deflate、br 接受语言:en-US,en;q=0.9 Cookie:AspxAutoDetectCookieSupport=1

【问题讨论】:

  • 您能否包含您在客户端收到的完整错误消息(以及标题)。您的代码中有几个地方设置了BadRequest,所以现在很难知道它们是否是根本原因......
  • 您是如何发送请求的?您是否尝试在服务器上记录收到的context.Request.ContentType?
  • 您正在发送一个HttpStatusCode.BadRequest 和一个正文。看来您只是未能在接收方read the body。
  • 我已经单步执行了代码,并且在我的代码端没有出现错误。没有异常发生
  • 您是否尝试过简化方案?我的意思是,注释掉所有逻辑,然后直接从该处理程序返回一些 JSON(即context.Response.Write("{'foo':'1'}")。如果可行,则问题出在您的代码中。如果没有,那么还有其他事情发生。调用客户端是什么?此外,我实际上并没有在该错误中看到任何地方显示“BadRequest”,您确定您在响应中收到 HTTP 400 吗?

标签: asp.net .net json vb.net httphandler


【解决方案1】:

您的代码中只有一个位置可以从服务器返回一条自定义消息,并带有“BadRequest”,位于以下几行:

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

这意味着您的业务逻辑正在返回这个(我不能说恰当与否)。您需要跟踪业务逻辑以找到呈现错误 SKU 消息的逻辑。从这个角度来看,ASHX 看起来工作正常。

【讨论】:

  • 您说得对,先生。谢谢你。我能够解决问题
猜你喜欢
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多