locked
Web API error How do I catch this specific error RRS feed

  • Question

  • User-1668014665 posted

    http://localhost:49327/api/data?sym=AAPL&token=XXXXXX&Dates=20190201

    The above URL works fine.

    This URL has a forced error

    http://localhost:49327/api/data?symAAPL&token=XXXXXX&Dates=20190201

    sym=AAPL is now symAAPL

    I get this error for symAAPL

    {
        "Message": "No HTTP resource was found that matches the request URI 'http://localhost:49327/api/data?symAAPL&token=0XD6C61922E&Dates=20190201'.",
        "MessageDetail": "No action was found on the controller 'Data' that matches the request."
    }

    My set up 

    Public Module WebApiConfig
        Public Sub Register(ByVal config As HttpConfiguration)
            ' Web API configuration and services
    
            config.Formatters.Add(New SDOHLCVCsvFormatter())
    
    
            ' Web API routes
            config.MapHttpAttributeRoutes()
    
            config.Routes.MapHttpRoute(
                name:="DefaultApi",
                routeTemplate:="api/{controller}/{id}",
                defaults:=New With {.id = RouteParameter.Optional}
                )
    
    
    
        End Sub
    End Module
    
    
    
    Namespace Controllers
        Public Class DataController
            Inherits ApiController
    
    
    
            'GET: /api/data?symbol=AAPL
            Public Function [Get](ByVal Sym As String,
                                  ByVal Token As String,
                                  Optional DateS As String = "19010101",
                                  Optional DateE As String = "20501231",
                                  Optional LastX As String = "0",
                                  Optional FHead As String = "True",
                                  Optional SymD As String = "True",
                                  Optional DateF As String = "1",
                                  Optional FName As String = "1"
                                  ) As HttpResponseMessage
    
                'DateS = User Start Date
                'DateE = User End Date
                'FHead = File header on or off data 1 or 0
                'SymD = Symbol in or out data line 1 or 0
    
                'DateF = Date Format
                'FName = Out Put text file name format
    
    
    
    Etc 
    
    etc

    Question how can I catch the error symAAPL better than the error report shown ??

    Tuesday, March 5, 2019 8:50 PM

Answers

  • User1120430333 posted

    IMO, you should have left the code I provided as is, becuase it would work on the simple fact that you threw the exception on validation. You should test it and throw a HTTPException and see what is the response. I think you would get the 404 or whatever HTTP Error code you wanted to use but also the custom message you made up on the validation error.

    _logger.Error(exceptionMessage)

    dim response = New HttpResponseMessage(HttpStatusCode.InternalServerError)With {.Content = New StringContent(“An exception was thrown by service.”),
    .ReasonPhrase = & ErrorexceptionMessage}

    The above could be that you check if it's a HTTPexception and give just the error.message, or if not, you give all the messages including the stack trace. 

    You got a HTTPexception becuase you were doing something completely wrong, or you got the exception a 404 on a validation error. You could even make your own 40x 400 range number that is not reserved.

    • Marked as answer by Anonymous Thursday, October 7, 2021 12:00 AM
    Wednesday, March 6, 2019 5:04 AM
  • User475983607 posted

    As stated 3 times above... VB.NET syntax Implements an interface it does not Inherit an Interface.  Inherit is use for classes.  The C# to VB.NET converter has a bug.

    Please see the VB.NET Programming guide for the proper syntax.

    https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/implements-clause

    I tested the code above before posting and it works as expected.  I don't think the code will work as you expect though.

    Registration

    Public Module WebApiConfig
        Public Sub Register(ByVal config As HttpConfiguration)
    
            config.Services.Replace(GetType(IExceptionHandler), New OopsExceptionHandler())

    Exception Handler

    Class OopsExceptionHandler
        Inherits ExceptionHandler
    
        Public Overrides Sub Handle(ByVal context As ExceptionHandlerContext)
            context.Result = New TextPlainErrorResult With {
                .Request = context.ExceptionContext.Request,
                .Content = "Oops! Sorry! Something went wrong." & "Please contact support@contoso.com so we can try to fix it."
            }
        End Sub
    
        Private Class TextPlainErrorResult
            Implements IHttpActionResult
    
            Public Property Request As HttpRequestMessage
            Public Property Content As String
    
            Private Function ExecuteAsync(cancellationToken As CancellationToken) As Task(Of HttpResponseMessage) Implements IHttpActionResult.ExecuteAsync
                Dim response As HttpResponseMessage = New HttpResponseMessage(HttpStatusCode.InternalServerError)
                response.Content = New StringContent(Content)
                response.RequestMessage = Request
                Return Task.FromResult(response)
            End Function
        End Class
    End Class

    Invoke the Exception Handler

            Public Function [Get]() As IEnumerable(Of SDOHLCV)
                Throw New Exception("This is a Test")
                Return data
            End Function

    • Marked as answer by Anonymous Thursday, October 7, 2021 12:00 AM
    Wednesday, March 6, 2019 6:06 PM

All replies

  • User475983607 posted

    Question how can I catch the error symAAPL better than the error report shown ??

    You have total control over this message.  Not sure what you want.  I generally return a 404 to the client.

    Tuesday, March 5, 2019 8:59 PM
  • User1120430333 posted

    I really don't think you want to throw back too much information like that.

    At best, just throw back the HTTP 404 not found. And have some documentation on what the WebAPI expects. 

    Tuesday, March 5, 2019 9:11 PM
  • User-1668014665 posted

    I tried this global class error catcher - NO LUCK

            Public Overrides Sub OnException(actionExecutedContext As HttpActionExecutedContext)
                MyBase.OnException(actionExecutedContext)
    
                Dim exceptionMessage As String = String.Empty
    
                If IsNothing(actionExecutedContext.Exception.InnerException) Then
                    exceptionMessage = actionExecutedContext.Exception.Message _
                                   & " " & actionExecutedContext.Exception.StackTrace
                Else
                    exceptionMessage = actionExecutedContext.Exception.Message _
                                    & " " & actionExecutedContext.Exception.InnerException.Message _
                                    & " " & actionExecutedContext.Exception.StackTrace
                End If
    
                ' _logger.Error(exceptionMessage)
    
                Dim response = New HttpResponseMessage(HttpStatusCode.InternalServerError) With {.Content = New StringContent(“An unhandled exception was thrown by service.”),
                    .ReasonPhrase = "Internal Server Error.Please Contact your Administrator."}
    
                actionExecutedContext.Response = response
    
            End Sub
        End Class
    
    APPLIED LIKE THIS
    
      <CustomExceptionFilter>
        Public Class DataController
            Inherits ApiController

    Tuesday, March 5, 2019 10:26 PM
  • User-1668014665 posted

    How do I return a 404 from my WEBAPI DLL GET function

    as the error is in the class variables and not the body of code, so I cant use TRY CATCH

    Tuesday, March 5, 2019 10:27 PM
  • User475983607 posted

    How do I return a 404 from my WEBAPI DLL GET function

    as the error is in the class variables and not the body of code, so I cant use TRY CATCH

    This URL...

    http://localhost:49327/api/data?symAAPL&token=XXXXXX&Dates=20190201

    ...is a parameter error.  The "sym" does not exist.  This is a pretty simple check.  If the parameter does not exist then then you have a 400 (Bad Request) error.    This is fairly standard Web API validation that's covered in the Getting Started docs.  Generally it is related to a model binding error but parameters none the less.

    https://docs.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api

    The ASP.NET Core docs covers this topic pretty well and the same constructs work in ASP.NET.

    https://docs.microsoft.com/en-us/aspnet/core/web-api/action-return-types?view=aspnetcore-2.2

    Tuesday, March 5, 2019 11:19 PM
  • User-1668014665 posted

    So is this correct

            
    
    <HttpGet("{Sym}")>
    <ProducesResponseType(StatusCodes.Status404NotFound)>
    
    Public Function [Get](ByVal Sym As String,
                                  ByVal Token As String,
                                  Optional DateS As String = "19010101",
                                  Optional DateE As String = "20501231",
                                  Optional LastX As String = "0",
                                  Optional FHead As String = "True",
                                  Optional SymD As String = "True",
                                  Optional DateF As String = "1",
                                  Optional FName As String = "1"
                                  ) As HttpResponseMessage

    What about Token, and the DateS, when some one does TokenDDDDDDD and not Token=DDDDDDD, and DateS20190101, when it should be DateS=20190101

    How do I handle multiple variable errors of missing '=' ??

    Tuesday, March 5, 2019 11:44 PM
  • User1120430333 posted

    I tried this global class error catcher - NO LUCK

    You would have had to have thrown a new exception manually with a error message you wanted in order for the global exception handler to be raised and catch the exception.

    https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/throw-statement

    I do it in the code where the MVC client in the presentation layer checks for success on the WebAPI call, and if not successful, it throws a new exception taking the response and having it logged by the GEH that is in the MVC project at the presentation layer.

    public List<DtoProject> GetProjsByUserIdApi(string userid)
            {
                var dtoprojects = new List<DtoProject>();
    
                using (var client = new HttpClient())
                {
                    var uri = new Uri("http://progmgmntcore2api.com/api/project/GetProjsByUserId?userid=" + userid);
    
                    var response = client.GetAsync(uri).Result;
    
                    if (!response.IsSuccessStatusCode)
                        throw new Exception(response.ToString());
    
                    var responseContent = response.Content;
                    var responseString = responseContent.ReadAsStringAsync().Result;
    
                    dynamic projects = JArray.Parse(responseString) as JArray;
    
                    foreach (var obj in projects)
                    {
                        DtoProject dto = obj.ToObject<DtoProject>();
    
                        dtoprojects.Add(dto);
                    }
                }
    
                return dtoprojects;
            }

    Tuesday, March 5, 2019 11:57 PM
  • User475983607 posted

    icm63

    How do I handle multiple variable errors of missing '=' ??

    The issue you are facing is directly proportional to the design.  It's tough to validate default input parameters because there is no way to determine if user sent the value or not.  This type of design loses the user's the intention.  From the user's perspective the results are either expected, unexpected, or null.

    In this situation, I would return a 404 along with the search criteria.  That way the client (user) can self-validate the input criteria and try again if needed.

    Wednesday, March 6, 2019 12:41 AM
  • User1120430333 posted

    How do I handle multiple variable errors of missing '=' ??

    You could throw a new HttpExceprtion setting the status code and error message and let the GEH handle it.

    https://docs.microsoft.com/en-us/dotnet/api/system.web.httpexception?redirectedfrom=MSDN&view=netframework-4.7.2

    https://stackoverflow.com/questions/4974562/possible-to-throw-a-404-error-within-an-asp-net-page

    Wednesday, March 6, 2019 1:01 AM
  • User475983607 posted

    How do I handle multiple variable errors of missing '=' ??

    You could throw a new HttpExceprtion setting the status code and error message and let the GEH handle it

    Global exception handlers are handlers for unexpected exceptions.   Expected or known possible issues are better handled by logical flow.  Logical flow should never be dependent on exceptions.   

    Wednesday, March 6, 2019 1:40 AM
  • User-1668014665 posted

    I tested all that code, out of date for .net 4.61 In MS Docs!

    Wednesday, March 6, 2019 2:15 AM
  • User1120430333 posted

    DA924

    How do I handle multiple variable errors of missing '=' ??

    You could throw a new HttpExceprtion setting the status code and error message and let the GEH handle it

    Global exception handlers are handlers for unexpected exceptions.   Expected or known possible issues are better handled by logical flow.  Logical flow should never be dependent on exceptions.   

    If one doesn't put a try/catch anywhere, then they are all unhandled exceptions.  Also as I see it,  one shoe doesn't fit all scenarios. For the most part, I agree with you that flow control should be consider in validation errors to not terminate the program and throw an exception, the preferred method.

    But I look at it like a Windows service that has a validation error that has no  user interface, like throwing the exception that notifies that something is wrong, a clue to a human and take the service down. . HttpException is there for a reason, and I wouldn't have a problem throwing that exception  in the scenario on a validation error and let GEH catch it, log it and give the appropriate response  in critical validation not met a notification being sent back to a human.

    And besides in the GEH, one could interrogate the exception, and if it's a HTTPException to do one thing as opposed to it being a SQL Exception and do something else. I wouldn't even do that myself, interrogate. The developer has complete control on how to handle the exception. 

    Wednesday, March 6, 2019 2:22 AM
  • User475983607 posted

    Post your code so we can see what you are doing? It is difficult to provide assistece without the source code.
    Wednesday, March 6, 2019 2:23 AM
  • User-1668014665 posted

    Following this example (First answer on page, the ooopsExceptionHandler)

    https://stackoverflow.com/questions/33710262/global-error-handling-in-asp-net-web-api-2

    My code conversion to vb

    The error I get below is : Inherits IHttpActionResult ****** ERROR IN .net 4.61 Class can inherit only from other classes

    Imports System
    Imports System.Collections.Generic
    Imports System.Linq
    Imports System.Net
    Imports System.Net.Http
    Imports System.Threading
    Imports System.Threading.Tasks
    Imports System.Web
    Imports System.Web.Http
    Imports System.Web.Http.ExceptionHandling
    
    
    Namespace WebApiExceptionHandling.HelperClasses.Handlers
        Public Class ooopsExceptionHandler
            Inherits ExceptionHandler
    
            Public Overrides Sub Handle(ByVal context As ExceptionHandlerContext)
                If TypeOf context.Exception Is ArgumentNullException Then
    
                    Dim result = New HttpResponseMessage(HttpStatusCode.BadRequest) With {
                        .Content = New StringContent(context.Exception.Message),
                        .ReasonPhrase = "ArgumentNullException"
                    }
                    context.Result = CType(New ErrorMessageResult(context.Request, result), IHttpActionResult)
                Else
    
                End If
            End Sub
    
    
            Public Class ErrorMessageResult
                Inherits IHttpActionResult    ****** ERROR IN .net 4.61 Class can inherit only from other classes
    
                Private _request As HttpRequestMessage
                Private _httpResponseMessage As HttpResponseMessage
    
                Public Sub New()
                End Sub
    
                Public Sub New(ByVal request As HttpRequestMessage, ByVal httpResponseMessage As HttpResponseMessage)
                    _request = request
                    _httpResponseMessage = httpResponseMessage
                End Sub
    
                Public Function ExecuteAsync(ByVal cancellationToken As CancellationToken) As Task(Of HttpResponseMessage)
                    Return Task.FromResult(_httpResponseMessage)
                End Function
            End Class
    
        End Class
    End Namespace
    

    Wednesday, March 6, 2019 2:33 AM
  • User36583972 posted


    Hi icm63,

    Question how can I catch the error symAAPL better than the error report shown ??

    You can try to use a Authentication Filters in ASP.NET Web API 2.

      [RequireHttps]
            public void Delete(int id)
            {
            }
    
        public class RequireHttpsAttribute : AuthorizationFilterAttribute
        {
            public override void OnAuthorization(HttpActionContext actionContext)
            {
                if (actionContext.Request.RequestUri.Scheme != Uri.UriSchemeHttps)
                {
                    // check the uri and return error message
                    actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest)
                    {
                        ReasonPhrase = "HTTPS format is incorrect!"
                    };
                }
                else
                {
                    base.OnAuthorization(actionContext);
                }
            }
        }

    Then, check the uri and return error message.

    Authentication Filters in ASP.NET Web API 2
    https://docs.microsoft.com/en-us/aspnet/web-api/overview/security/authentication-filters


    Best Regards

    Yong Lu

    Wednesday, March 6, 2019 3:25 AM
  • User1120430333 posted

    IMO, you should have left the code I provided as is, becuase it would work on the simple fact that you threw the exception on validation. You should test it and throw a HTTPException and see what is the response. I think you would get the 404 or whatever HTTP Error code you wanted to use but also the custom message you made up on the validation error.

    _logger.Error(exceptionMessage)

    dim response = New HttpResponseMessage(HttpStatusCode.InternalServerError)With {.Content = New StringContent(“An exception was thrown by service.”),
    .ReasonPhrase = & ErrorexceptionMessage}

    The above could be that you check if it's a HTTPexception and give just the error.message, or if not, you give all the messages including the stack trace. 

    You got a HTTPexception becuase you were doing something completely wrong, or you got the exception a 404 on a validation error. You could even make your own 40x 400 range number that is not reserved.

    • Marked as answer by Anonymous Thursday, October 7, 2021 12:00 AM
    Wednesday, March 6, 2019 5:04 AM
  • User475983607 posted

    icm63

    Following this example (First answer on page, the ooopsExceptionHandler)

    https://stackoverflow.com/questions/33710262/global-error-handling-in-asp-net-web-api-2

    My code conversion to vb

    The error I get below is : Inherits IHttpActionResult ****** ERROR IN .net 4.61 Class can inherit only from other classes

    Oh, Implements an interface not Inherits in VB.NET. 

            Public Class ErrorMessageResult
            Implements IHttpActionResult    '****** Error In .net 4.61 Class can inherit only from other classes
    
            Private _request As HttpRequestMessage
                Private _httpResponseMessage As HttpResponseMessage
    
                Public Sub New()
                End Sub
    
                Public Sub New(ByVal request As HttpRequestMessage, ByVal httpResponseMessage As HttpResponseMessage)
                    _request = request
                    _httpResponseMessage = httpResponseMessage
                End Sub
    
            Public Function ExecuteAsync(ByVal cancellationToken As CancellationToken) As Task(Of HttpResponseMessage) Implements IHttpActionResult.ExecuteAsync
                Throw New NotImplementedException()
                Return Task.FromResult(_httpResponseMessage)
                End Function
    
        End Class

    There are two types of 404s. 

    The URL is just wrong.  The request must make its way to the application in order to handle a messed up URL.  There's no guarantee that will happen but you can use a global filter if the route is not found or resolved.

    The resource was not found.  This happens when looking up records in the database but the query returns an empty result set.  This is validation I thought you were trying to handle.

    Wednesday, March 6, 2019 1:17 PM
  • User753101303 posted

    Hi,

    VB uses separate keywords ie you have Inherits but here you want to use Implements...

    If I followed the problem doesn't even happen inside into your controller. ASP.NET just doesn't find any action that is really matching so it returns a 404. You would like to return which code instead ?

    Not sure but the simplest approach could be to inherit from a controller with a dummy Get action that would return a particular response...

    Wednesday, March 6, 2019 1:46 PM
  • User-1668014665 posted

    Ok this code from this link is wrong

    https://stackoverflow.com/questions/33710262/global-error-handling-in-asp-net-web-api-2

    The code from MS Docs API for global Error catching (404,500) is for an earlier version of .net (ie think 4.5.2), I am in 4.6.1 Net vb

    Where does a fellow got to get an example to error catching at a higher level that the code with in the datacontoller GET function ( ie TRY CATCH)? 

    NOTE: Not yet tested DAs proposal. Will do that in a day to so!

    Wednesday, March 6, 2019 4:07 PM
  • User475983607 posted

    You really need to read the docs so you understand what you can do in Web API 2.  Web API is an API not a UI app.  Web API consumers are code client or basically other developers.  You'll want to provide enough information to stop the devs from blowing up your actions.

    https://docs.microsoft.com/en-us/aspnet/web-api/overview/error-handling/web-api-global-error-handling

    Part of the complexity with Web API is the caller expects an XML or JSON response; error or not.   The biggest bang for the buck is input validation manual or model binding.  Validating inputs is not a new concept in programming but it is important in Web API because there is no UI.  Sometimes you need to report to the caller what happened so they  fix their bugs.  The next line of defense is try...catch.  Pretty standard; nothing new.  Lastly, global exception handlers. where you can catch and log exceptions that bubbled all the way to surface totally unhanded; the wild west.  This is generally unexpected, "Oops something went terribly wrong.  Sorry about that!  We are looking into this issue.". 

    icm63

    Where does a fellow got to get an example to error catching at a higher level that the code with in the datacontoller GET function ( ie TRY CATCH)? 

    tI think you mean lower level perhaps middleware.  My comments above, except the global handlers, is high level as The request made it to the Controller and Action.

    Wednesday, March 6, 2019 4:47 PM
  • User-1668014665 posted

    Thanks for your support

    This code does not work in net 4.61 from your link, in MS docs

    https://docs.microsoft.com/en-us/aspnet/web-api/overview/error-handling/web-api-global-error-handling

    As per my previous post

    class OopsExceptionHandler : ExceptionHandler
    {
        public override void HandleCore(ExceptionHandlerContext context)
        {
            context.Result = new TextPlainErrorResult
            {
                Request = context.ExceptionContext.Request,
                Content = "Oops! Sorry! Something went wrong." +
                          "Please contact support@contoso.com so we can try to fix it."
            };
        }
    
        private class TextPlainErrorResult : IHttpActionResult
        {
            public HttpRequestMessage Request { get; set; }
    
            public string Content { get; set; }
    
            public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
            {
                HttpResponseMessage response = 
                                 new HttpResponseMessage(HttpStatusCode.InternalServerError);
                response.Content = new StringContent(Content);
                response.RequestMessage = Request;
                return Task.FromResult(response);
            }
        }
    }

    Vb conversion via Telerik

    Class OopsExceptionHandler
        Inherits ExceptionHandler
    
        Public Overrides Sub HandleCore(ByVal context As ExceptionHandlerContext)
            context.Result = New TextPlainErrorResult With {
                .Request = context.ExceptionContext.Request,
                .Content = "Oops! Sorry! Something went wrong." & "Please contact support@contoso.com so we can try to fix it."
            }
        End Sub
    
        Private Class TextPlainErrorResult
            Inherits IHttpActionResult   (***** ERROR in vb 4.61 or should this be implements??)
    
            Public Property Request As HttpRequestMessage
            Public Property Content As String
    
            Public Function ExecuteAsync(ByVal cancellationToken As CancellationToken) As Task(Of HttpResponseMessage)
                Dim response As HttpResponseMessage = New HttpResponseMessage(HttpStatusCode.InternalServerError)
                response.Content = New StringContent(Content)
                response.RequestMessage = Request
                Return Task.FromResult(response)
            End Function
        End Class
    End Class
    

    Wednesday, March 6, 2019 5:12 PM
  • User475983607 posted

    As stated 3 times above... VB.NET syntax Implements an interface it does not Inherit an Interface.  Inherit is use for classes.  The C# to VB.NET converter has a bug.

    Please see the VB.NET Programming guide for the proper syntax.

    https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/implements-clause

    I tested the code above before posting and it works as expected.  I don't think the code will work as you expect though.

    Registration

    Public Module WebApiConfig
        Public Sub Register(ByVal config As HttpConfiguration)
    
            config.Services.Replace(GetType(IExceptionHandler), New OopsExceptionHandler())

    Exception Handler

    Class OopsExceptionHandler
        Inherits ExceptionHandler
    
        Public Overrides Sub Handle(ByVal context As ExceptionHandlerContext)
            context.Result = New TextPlainErrorResult With {
                .Request = context.ExceptionContext.Request,
                .Content = "Oops! Sorry! Something went wrong." & "Please contact support@contoso.com so we can try to fix it."
            }
        End Sub
    
        Private Class TextPlainErrorResult
            Implements IHttpActionResult
    
            Public Property Request As HttpRequestMessage
            Public Property Content As String
    
            Private Function ExecuteAsync(cancellationToken As CancellationToken) As Task(Of HttpResponseMessage) Implements IHttpActionResult.ExecuteAsync
                Dim response As HttpResponseMessage = New HttpResponseMessage(HttpStatusCode.InternalServerError)
                response.Content = New StringContent(Content)
                response.RequestMessage = Request
                Return Task.FromResult(response)
            End Function
        End Class
    End Class

    Invoke the Exception Handler

            Public Function [Get]() As IEnumerable(Of SDOHLCV)
                Throw New Exception("This is a Test")
                Return data
            End Function

    • Marked as answer by Anonymous Thursday, October 7, 2021 12:00 AM
    Wednesday, March 6, 2019 6:06 PM
  • User-1668014665 posted

    3 times before.

    Ok sorry. Thanks

    Maybe show the love for VB folks in the MS DOCs...

    Wednesday, March 6, 2019 6:12 PM
  • User1120430333 posted

    IHttpActionResult  -- Interfaces are implemented. 

    Wednesday, March 6, 2019 6:12 PM
  • User1120430333 posted

    3 times before.

    Ok sorry. Thanks

    Maybe show the love for VB folks in the MS DOCs...

    VB.NET is not a standard that is controlled by the ISO and ECMA Standards Committees. VB.NET is short-sheeted on documentation. 

    Wednesday, March 6, 2019 6:15 PM
  • User475983607 posted

    Maybe show the love for VB folks in the MS DOCs...

    VB.NET is making a come back in Core 3.0.  Maybe we'll see more VB.NET examples.  There is always learning the syntax too...

    Wednesday, March 6, 2019 6:38 PM