繁体   English   中英

如何解决ASMX的输入验证

[英]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将反序列化输入到类的实例中。 这样做有很多好处,原因如下:

  • (1)由于该类仅包含字符串,因此ASMX不会引发任何异常
  • (2)您可以从类中完全控制输入参数的名称。 这是DRY原理的一大优点。

在这里定义我的输入:

    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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM