2015-09-28 5 views
2

У меня есть служба WCF Rest, которая выполняет входную проверку параметров с помощью IParameterInspector, прежде чем вызывать фактический метод обслуживания. Теперь эти службы отдыха потребляются iPhone. Если параметр недействителен, у меня возникла ошибка, которую я хочу обработать на iPhone (или может быть Android). Ну, я ссылаюсь на столько ссылок в stackoverflow, и я использовал ссылку ниже в качестве ссылки в своем коде.Проверка параметров WCF с использованием IParameterInspector и дескриптора FaultException у клиента

WCF Parameter Validation with Interceptor
Ниже приводится мой пошаговый фрагмент кода.

=> FaultExceptionResponse класс, который используется в FaultException<T>

[DataContract] 
public class FaultExceptionResponse 
{ 
     [DataMember] 
     public bool Success { get; set; } 

     [DataMember] 
     public string ResponseString { get; set; } 
} 

=> Ниже параметров класса Validate.

public class ValidationParameterInspectorAttribute : Attribute, IParameterInspector, IOperationBehavior 
    { 

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

     public object BeforeCall(string operationName, object[] inputs) 
     { 
      if (operationName == "GetCommunicationDetailById") 
      { 
       var communicationChatViewModel = inputs.FirstOrDefault() as CommunicationChatViewModel; 

       if (communicationChatViewModel != null && 
        (communicationChatViewModel.iConsultCommunicationID <= 0)) 
       { 
        //ErrorLogger.LogErrorMessageToElmah(new ArgumentException("API Name: GetCommunicationDetailById Parameter cannot be less than zero.", "iConsultCommunicationID")); 
        var fc = new FaultExceptionResponse { Success = false, ResponseString = "Invalid parameter found while fetching communication detail !" }; 
        throw new FaultException<FaultExceptionResponse>(fc, new FaultReason(fc.ResponseString)); 
       } 
      } 
      return null; 
     } 

     public void AddBindingParameters(OperationDescription operationDescription, System.ServiceModel.Channels.BindingParameterCollection bindingParameters) 
     { 
     } 

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

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

     public void Validate(OperationDescription operationDescription) 
     { 
     } 
    } 

=>, а затем я должен украсить свой API, как это

[OperationContract] 
[ValidationParameterInspector] 
[FaultContract(typeof(FaultExceptionResponse))] 
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, 
      UriTemplate = "/GetCommunicationDetailById")] 
CommunicationChatDetailList GetCommunicationDetailById(CommunicationChatViewModel communicationParaViewModel); 

Все работает нормально, но когда параметр не действует, то это FaultException выброшены на iPhone стороне, это только показывает, ниже информация об ошибке.

Error: { 
    AFNetworkingOperationFailingURLResponseErrorKey = "<NSHTTPURLResponse: 0x7faa605faa90> { URL: http://192.168.151.40/MyWCF/Service1.svc/GetCommunicationDetailById } { status code: 400, headers {\n    \"Cache-Control\" = private;\n    \"Content-Length\" = 3319;\n    \"Content-Type\" = \"text/html\";\n    Date = \"Fri, 25 Sep 2015 15:45:14 GMT\";\n    Server = \"Microsoft-IIS/7.5\";\n    \"X-AspNet-Version\" = \"4.0.30319\";\n    \"X-Powered-By\" = \"ASP.NET\";\n} }"; 
    NSErrorFailingURLKey = "http://192.168.151.40/MyWCF/Service1.svc/GetCommunicationDetailById"; 
    NSLocalizedDescription = "Request failed: bad request (400)"; 
    NSUnderlyingError = "Error Domain=AFNetworkingErrorDomain Code=-1016 \"Request failed: unacceptable content-type: text/html\" UserInfo={AFNetworkingOperationFailingURLResponseErrorKey=<NSHTTPURLResponse: 0x7faa605faa90> { URL: http://192.168.151.40/LKPracooWCF/Service1.svc/GetCommunicationDetailById } { status code: 400, headers {\n    \"Cache-Control\" = private;\n    \"Content-Length\" = 3319;\n    \"Content-Type\" = \"text/html\";\n    Date = \"Fri, 25 Sep 2015 15:45:14 GMT\";\n    Server = \"Microsoft-IIS/7.5\";\n    \"X-AspNet-Version\" = \"4.0.30319\";\n    \"X-Powered-By\" = \"ASP.NET\";\n} }, NSLocalizedDescription=Request failed: unacceptable content-type: text/html, NSErrorFailingURLKey=http://192.168.151.40/LKPracooWCF/Service1.svc/GetCommunicationDetailById 
}; 

Я не нашел свое сообщение об ошибке !!!! Теперь, если я тестирую один и тот же тестовый пример в Продвинутое клиентское приложение для отдыха, тогда я получил свой собственный mess mess mess, как показано ниже.

Status - 400 Bad Request 
<p class="heading1">Request Error</p> 
<p>The server encountered an error processing the request. The exception message is 'Invalid parameter found while fetching communication detail !'. See server logs for more details. The exception stack trace is: </p> 
<p>......</p> 

Так что я хочу, как справиться с этой FaultException FaultException<FaultExceptionResponse> на клиента (iPhone) стороне ???.

ответ

1

Проблема заключается в том, что ваша служба должна возвращать Json, но исключение вызывает тип содержимого ответа text/html. Вы можете отказаться от использования FaultException и переключиться на исключение WebFaultException, а также явно указать тип содержимого для ответа. Например:

WebOperationContext.Current.OutgoingResponse.ContentType = "application/json"; 
var exception = new WebFaultException<string>(
    "{ \"Success\" = \"false\", " + 
    "\"ResponseString\" = \"Invalid parameter found while fetching communication detail !\" }", 
    HttpStatusCode.BadRequest); 
throw exception; 
+0

Вау .... Это что я хочу .... Большое спасибо Мэтт. –

2

Просто расширить ответ, данный MattC. Большое спасибо Мэтт. Я отправляю этот код детали как ответ только для будущего читателя, который придет к этой ссылке в SO. Еще одна вещь, я также написал в блоге в моем блоге - krishnrajrana.wordpress.com

Так ребята вот как вы справляетесь исключение на клиенте (например, iPhone устройств или андроид устройств)

public object BeforeCall(string operationName, object[] inputs) 
{ 
    if (operationName == "GetCommunicationDetailById") 
    { 
     var model = inputs.FirstOrDefault() as TestViewModel; 

     if (model != null && 
      (model.iConsultCommunicationID <= 0)) 
     { 
      WebOperationContext.Current.OutgoingResponse.ContentType = "application/json"; 
      var wfc = new WebFaultException<Response>(new Response(false, "Invalid parameter found while fetching detail !"), System.Net.HttpStatusCode.OK); 
      throw wfc; 
     } 
    } 
    else if (operationName == "AnotherMethod") 
    { 
     ............ 
    } 

    // OR you can use switch case 
    switch(operationName) 
    { 
     Case "Method": 
      // your logic 
    } 

    return null; 
}