【问题标题】:Why does this non-primitive type conversion fail in webmethod parameter?为什么这种非原始类型转换在 webmethod 参数中失败?
【发布时间】:2019-05-09 22:45:40
【问题描述】:

我创建了一个自定义类“TestStr”,旨在与原始字符串互换:

Public Class TestStr
    Public ReadOnly Property Value As String
    Public Sub New(ByVal s As String)
        Value = s
    End Sub
    Public Shared Widening Operator CType(ByVal s As TestStr) As Long
        Return s.Value
    End Operator
    Public Shared Narrowing Operator CType(ByVal s As String) As TestStr
        Return New TestStr(s)
    End Operator
End Class

实际上,在大多数情况下,这似乎都可以正常工作:

Dim x As TestStr = "hey"
Dim y As String = x

但是,当我在 webmethod 中有一个 TestStr 作为参数时,如下所示:

<WebMethod(True), ScriptMethod(ResponseFormat:=ResponseFormat.Json, UseHttpGet:=True)>
Public Shared Function GetClientUserRecord(ByVal ClientUserId As TestStr) As String

Web 方法调用失败,我在浏览器控制台中收到此错误:

Cannot convert object of type "System.String" to type "my.mamespace.TestStr"
   at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object\u0026 convertedObject)
   at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object\u0026 convertedObject)
   at System.Web.Script.Services.WebServiceMethodData.StrongTypeParameters(IDictionary`2 rawParams)
   at System.Web.Script.Services.WebServiceMethodData.CallMethodFromRawParams(Object target, IDictionary`2 parameters)
   at System.Web.Script.Services.RestHandler.InvokeMethod(HttpContext context, WebServiceMethodData methodData, IDictionary`2 rawParams)
   at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.InvalidOperationException"}

是我在类设置中做错了什么,还是 VB.NET 不支持?作为参考,我使用的是 .NET Framework 4.6。这样做的主要目的是让 TestStr 的构造函数自动处理 null/empty 字符串,并修剪用户输入的字符串,因此可以使用参数“test”调用 web 方法,我不需要每次都手动修剪字符串带有用户输入的网络方法。

【问题讨论】:

  • 在 ASP.NET MVC 中,如果自定义类型定义了类型转换器,它将使用它。我不确定网络方法是否以同样的方式工作,但值得一试。
  • 是的!效果很好,谢谢!
  • 如果您将此作为答案发布,我可以将其批准为正确答案等。

标签: vb.net casting webmethod


【解决方案1】:

ASP.NET MVC 和 Web 方法显然也会使用为您的自定义类型定义的类型转换器将输入转换为该类型。

System.Uritype converter 可能是一个很好的例子。对于像TestStr 这样的简单包装器,您需要做的更少。

【讨论】:

    猜你喜欢
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 2012-07-25
    • 1970-01-01
    • 2018-06-18
    • 2013-03-25
    相关资源
    最近更新 更多