WCF проверяет Json-запрос перед выполнением метода с IParamaterInspector - PullRequest
0 голосов
/ 14 января 2019

Я поддерживаю и разрабатываю новые сервисы для старой структуры API с помощью WCF для мобильного приложения. Я заметил, что недопустимые значения для поля (например, строковое значение для десятичного поля) выдают исключение на этапе десериализации перед обращением к методу. Я хотел использовать IParamaterInspector для обработки проверки перед обращением к методу. Но даже после выполнения всех необходимых шагов это не относится к методу BeforeCall. Похоже, я пропустил очень важный шаг.

public class ValidateParameterInspectorAttribute : Attribute, IParameterInspector, IOperationBehavior
{
    public object BeforeCall(string operationName, object[] inputs)
    {
        return null;
    }

    public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState)
    {
    }


    public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation)
    {
    }


    public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
    {
        dispatchOperation.ParameterInspectors.Add(this);
    }


    public void Validate(OperationDescription operationDescription)
    {
        //throw new NotImplementedException();
    }


    public void AddBindingParameters(OperationDescription operationDescription, BindingParameterCollection bindingParameters)
    {
        //throw new NotImplementedException();
    }
}

И использование атрибута следующим образом,

[OperationContract]
[ValidateParameterInspector]
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
void TestMethod(TestRequest testRequest);

1 Ответ

0 голосов
/ 15 января 2019

Я сделал тест и добился успеха, но я разделяю IParameterInspector и IOperationBehavior

Ниже мой код.

Моя модель.

 [DataContract]
public class Employee
{
    [DataMember]
    public string Id { get; set; }
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public string Department { get; set; }
    [DataMember]
    public string Grade { get; set; }
}

ParameterInspector

 public class MyParameterInspector : IParameterInspector
{
    public void AfterCall(string operationName, object[] outputs,objectreturnValue,   object correlationState)
    {

    }

public object BeforeCall(string operationName, object[] inputs)
    {
        Employee ee = inputs[0] as Employee;
            ee.Name = "myname";
        return inputs;
    }
}

OperationBehavior

  public class ParameterInspectorOperationBehavior :Attribute, IOperationBehavior
{
    public void AddBindingParameters(OperationDescription operationDescription, BindingParameterCollection bindingParameters)
    {
    }

    public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation)
    {
    }

    public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
    {
        dispatchOperation.ParameterInspectors.Add(new MyParameterInspector());
    }

    public void Validate(OperationDescription operationDescription)
    {

    }
}

ServiceContract

 [ServiceContract]
 public interface IRestService
{
    [ParameterInspectorOperationBehavior]
 [WebInvoke(UriTemplate="/", Method = "POST", ResponseFormat =WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
    void Get(Employee employee);
}

Сервисная конфигурация

  <service name="Service.Rest.RestService">
    <endpoint address="http://localhost:3721/employee" contract="ServiceInterface.IRestService" binding="webHttpBinding"></endpoint>
  </service>

Конфигурация клиента

<endpoint  name="RestParameterInspector" address="http://localhost:3721/employee" contract="ServiceInterface.IRestService" binding="webHttpBinding"
           behaviorConfiguration="webBehavior"></endpoint>
 <endpointBehaviors>
    <behavior name="webBehavior">
      <webHttp />
    </behavior>
  </endpointBehaviors>

Результат

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...