[英]How can I get around ASMX's input validation
我正在使用C#asmx创建Web服务。 我想在每个Web方法中执行自己的输入验证。 在编写代码时,我意识到asmx本身会在输入到达Web方法之前验证输入,因此使我自己无法执行验证。 让我告诉你我的意思。
说我有一个这样的网络方法:
[WebMethod]
public string method(int param1)
{
Validate(param1)
}
如果调用method
的人传递了 for param1
,那么asmx本身将引发异常,然后我才能进行自己的验证。 (因为a不是int
类型,所以抛出异常。)
现在,我可以将param1
为字符串,然后根据asmx的验证,用户放入param1
任何内容都将是有效的。 但这是不可取的,因为我不会在这里讨论。
有没有一种方法可以在不使所有类型为string
的参数的情况下实现我要实现的目标? 如果没有,那不是世界的尽头,因为我可以使之工作,但我想知道是否有办法。
PS,我知道asmx已过时,但是我的公司告诉我使用它。
编辑:我会说一件事,以帮助您解决我的问题。 我希望我的Web服务在所有情况下都返回具有特定结构的json字符串,即使输入无效。 如果输入无效,则应返回一个json字符串说明问题。 但在输入无效的情况下,我无法执行此操作,因为asmx在请求到达我的Web方法之前引发了异常。
我了解为什么asmx是旧版。 它不能让您控制输入验证的事实是荒谬的。
我想到了。
您需要创建一个类,该类根据字符串定义输入。 然后,使此类成为Web方法的输入参数的类型。 ASMX将反序列化输入到类的实例中。 这样做有很多好处,原因如下:
在这里定义我的输入:
public abstract class Input
{
}
public class CreatePendingOrderInput : Input
{
public string customerNo;
public string callingCountry;
}
}
现在,只需将其与网络方法联系起来即可:
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string CreatePendingOrder(CreatePendingOrderInput input)
{
return JsonConvert.SerializeObject((IVRProcesses.Process<CreatePendingOrderOutput>(IVRProcesses.CreatePendingOrder, input)));
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.