为什么这种非原始类型转换在 web 方法参数中失败?
Why does this non-primitive type conversion fail in webmethod parameter?
我创建了一个自定义 class "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
但是,当我在 web 方法中将 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"}
是我在 class 设置中做错了什么,还是 VB.NET 不支持?作为参考,我使用的是 .NET Framework 4.6。这样做的主要目的是让 TestStr 的构造函数自动处理 null/empty 字符串,以及 trim 用户输入的字符串,因此可以使用参数“test”调用 webmethod 而我不需要在每个网络方法中使用用户输入手动字符串 trimming。
ASP.NET MVC,显然还有 web 方法,也将使用为您的自定义类型定义的类型转换器将输入转换为该类型。
type converter for System.Uri
可能就是一个很好的例子。对于像 TestStr
这样的简单包装器,您需要做的更少。
我创建了一个自定义 class "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
但是,当我在 web 方法中将 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"}
是我在 class 设置中做错了什么,还是 VB.NET 不支持?作为参考,我使用的是 .NET Framework 4.6。这样做的主要目的是让 TestStr 的构造函数自动处理 null/empty 字符串,以及 trim 用户输入的字符串,因此可以使用参数“test”调用 webmethod 而我不需要在每个网络方法中使用用户输入手动字符串 trimming。
ASP.NET MVC,显然还有 web 方法,也将使用为您的自定义类型定义的类型转换器将输入转换为该类型。
type converter for System.Uri
可能就是一个很好的例子。对于像 TestStr
这样的简单包装器,您需要做的更少。