Как я могу обойти проверку ввода ASMX - PullRequest
0 голосов
/ 07 ноября 2018

Я создаю веб-сервис с использованием C # asmx. Я хочу выполнить свою собственную проверку ввода внутри каждого веб-метода. Когда я писал код, я понял, что сама asmx проверяет ввод перед тем, как ввод попадет в веб-метод, что не позволяет мне выполнять проверку самостоятельно. Позвольте мне показать вам, что я имею в виду.

Скажем, у меня есть такой веб-метод:

[WebMethod]
public string method(int param1)
    {
       Validate(param1)
    }

Если человек, вызывающий method, передаст a для param1, то сам asmx сгенерирует исключение, прежде чем я смогу выполнить свою собственную проверку. (Выдает исключение, потому что a не относится к типу int.)

Теперь я могу просто сделать param1 строкой, тогда все, что пользователь введет в param1, будет действительным в соответствии с проверкой asmx. Но это нежелательно по причинам, о которых я здесь не буду говорить.

Есть ли способ достичь того, чего я пытаюсь достичь, не задавая все параметры типа string? Если нет, то это не конец света, так как я могу заставить его работать, но я хотел бы знать, есть ли способ.

P.S. Я знаю, что asmx устарел, но моя компания сказала мне использовать его.

EDIT: Я скажу еще одну вещь, чтобы помочь вам решить мою проблему. Я хочу, чтобы мой веб-сервис возвращал строку json с определенной структурой во всех случаях, даже если ввод неверен. В случае, если ввод недопустим, должна быть возвращена строка json, объясняющая проблему. Но я не могу этого сделать в случае неверного ввода, так как asmx выдал исключение, прежде чем запрос попадет в мой веб-метод.

Я понимаю, почему asmx является наследием. Тот факт, что он не позволяет вам контролировать проверку ввода, просто смешен.

1 Ответ

0 голосов
/ 08 ноября 2018

Я понял это.

Вам необходимо создать класс, который определяет ввод в терминах строк. Затем сделайте этот класс типом входного параметра веб-метода. ASMX десериализует входные данные в экземпляр класса. Это отлично по ряду причин:

  • (1), поскольку класс содержит только строки, ASMX
  • (2) вы можете полностью контролировать имена входных параметров из класса. Это большой плюс для принципа СУХОЙ.

Здесь я определяю свой ввод:

    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)));
        }
    }
...