在VB中调用REST服务时出现内部服务器错误500

时间:2018-04-30 14:05:10

标签: json vb.net rest api web-services

我正在使用同事的代码尝试在控制台应用程序中重新创建他的REST Web服务。我对Web服务和VB都很陌生,所以对我来说这很困难。它会在他的工作正常,但我不断收到内部服务器错误(500)。我已经看了这个,我发现一些建议正在改变“POST”到“GET”,但我收到了“无法获得这个动词类型的内容体”。我见过关于这样的事情的论坛不能在另一个人的机器上工作。我的同事和我一遍又一遍地尝试过,但得到了相同的结果。

这是控制台应用

Imports System
Imports System.Collections.Generic
Imports System.IO
Imports System.Linq
Imports System.Net
Imports System.Reflection
Imports System.Text
Imports System.Threading.Tasks
Imports System.Web
Imports System.Web.UI
Imports System.Xml

Module RestConsoleClient
Private req As HttpWebRequest = Nothing
Private res As HttpWebResponse = Nothing
Private responseText As String = ""

Sub Main(args As String())

    Dim url As String = ""

    Try
        If args.Count < 1 OrElse String.IsNullOrEmpty(args(0)) Then
            Console.WriteLine("Endpoint Address is required as commandline argument;" _
                              & vbCrLf & "Copy/Paste one of the endpoint addresses from My.Settings into the Debug commandline arguments section" _
                              & vbCrLf & vbCrLf & "Press ENTER to start over...")
            Console.ReadKey()
            Return
        Else
            url = args(0)
        End If

        req = CType(WebRequest.Create(url), HttpWebRequest)
        req.Method = "POST"

        '** The conditions below allowed for generic raw data to be input as text vs. processing input data as a json object.
        '** These conditions became redundant with the addition of config for WebContentTypeMapper and corresponding class to accept
        '**     a post declared with application/json ContentType as generic raw data, and then SUBSEQUENTLY de/serialize the json data as necessary
        'If url.Contains("streamweaver") Then
        '    req.ContentType = "text"
        'ElseIf url.Contains("auth") Then
        '    req.ContentType = "application/json"   '; charset=utf-8"
        'Else
        '    'No other options are yet determined
        'End If
        req.Timeout = 30000

        Dim sJson As String = "{""Name"":""Ashu"",""Age"":""29"",""Exp"":""7 Years"",""Technology"":"".NET""}"
        Dim postBytes = Encoding.UTF8.GetBytes(sJson)
        req.ContentLength = postBytes.Length
        Dim requestStream As Stream = req.GetRequestStream()
        requestStream.Write(postBytes, 0, postBytes.Length)

        res = CType(req.GetResponse(), HttpWebResponse)

        ' I retained the basics for response reception even though it was not integral to this test
        Dim responseStream As Stream = res.GetResponseStream()
        Dim streamReader = New StreamReader(responseStream)

        responseText = streamReader.ReadToEnd()

        Console.WriteLine("HTTP Response: " & res.StatusCode & " - " & res.StatusDescription.Trim)
        Console.WriteLine("[ Response Data: " & responseText.Trim & " ]")
        Console.ReadKey()

    Catch ex As Exception
        Console.WriteLine(ex.Message)
        Console.ReadKey()
    End Try

End Sub
End Module

这是界面

Imports System.IO
Imports System.ServiceModel
Imports System.ServiceModel.Web

<ServiceContract> _
Public Interface IRestServiceImpl

'<OperationContract> _
'<WebInvoke(Method:="GET", ResponseFormat:=WebMessageFormat.Xml, BodyStyle:=WebMessageBodyStyle.Wrapped, UriTemplate:="xml/{id}")> _
'Function XMLData(id As String) As String

'<OperationContract> _
'<WebInvoke(Method:="GET", ResponseFormat:=WebMessageFormat.Json, BodyStyle:=WebMessageBodyStyle.Wrapped, UriTemplate:="json/{id}")> _
'Function JSONData(id As String) As String

<OperationContract> _
<WebInvoke(Method:="POST", ResponseFormat:=WebMessageFormat.Json, RequestFormat:=WebMessageFormat.Json, BodyStyle:=WebMessageBodyStyle.Bare, UriTemplate:="auth")> _
Function Auth(rData As Stream) As ResponseData

<OperationContract> _
<WebInvoke(Method:="POST", ResponseFormat:=WebMessageFormat.Json, RequestFormat:=WebMessageFormat.Json, BodyStyle:=WebMessageBodyStyle.Bare, UriTemplate:="streamweaver")> _
Function StreamWeaver(sData As Stream) As String

End Interface

这是班级

Imports System
Imports System.IO
Imports System.Reflection
Imports System.Security.AccessControl
Imports System.Text
Imports Newtonsoft.Json

Public Class RestServiceImpl
Implements IRestServiceImpl

Private filePathOnServer As String = My.Settings.OutputFolder

'Public Function XMLData(id As String) As String Implements IRestServiceImpl.XMLData
'    Return "You requested product " & id
'End Function

'Public Function JSONData(id As String) As String Implements IRestServiceImpl.JSONData
'    Return "You requested product " & id
'End Function

Public Function Auth(request As Stream) As ResponseData Implements IRestServiceImpl.Auth

    Dim streamReader = New StreamReader(request)
    Dim requestText As String = streamReader.ReadToEnd()

    Dim rData As RequestData = JsonConvert.DeserializeObject(Of RequestData)(requestText)

    Dim response = New ResponseData() With { _
        .Name = rData.Name, _
        .Age = rData.Age, _
        .Exp = rData.Exp, _
        .Technology = rData.Technology _
    }

    Dim fileOutput As String = "As of " & DateTime.Now & ", " _
                               & response.Name.Trim & " is a person who is " _
                               & response.Age.Trim & " years old, having " _
                               & response.Exp.Trim & " of experience with " _
                               & response.Technology.Trim & " technology."
    Console.SetError(New StreamWriter("C:\Users\apearson\Documents\Eureka.txt"))
    Console.[Error].WriteLine(fileOutput)
    Console.[Error].Close()

    Dim ctx As WebOperationContext = WebOperationContext.Current
    If rData IsNot Nothing Then
        ctx.OutgoingResponse.StatusCode = Net.HttpStatusCode.Accepted
    Else
        ctx.OutgoingResponse.StatusCode = Net.HttpStatusCode.NotAcceptable
    End If

    Return response
End Function

Public Function StreamWeaver(reqData As Stream) As String Implements IRestServiceImpl.StreamWeaver
    StreamWeaver = Nothing

    Dim ctx As WebOperationContext = WebOperationContext.Current
    If reqData IsNot Nothing Then
        ctx.OutgoingResponse.StatusCode = Net.HttpStatusCode.Accepted
    Else
        ctx.OutgoingResponse.StatusCode = Net.HttpStatusCode.NotAcceptable
    End If

    Dim streamReader As StreamReader = New StreamReader(reqData)
    StreamWeaver = streamReader.ReadToEnd()

    Console.SetError(New StreamWriter(filePathOnServer.Trim & "\RestServiceJSONRaw.txt"))
    Console.[Error].WriteLine(DateTime.Now & ": " & vbCrLf & StreamWeaver.Trim)
    Console.[Error].Close()

    Return StreamWeaver

End Function

End Class

如果还有其他信息,请告诉我。再次,这对我来说是一种新的东西。

0 个答案:

没有答案