Comment Gérer WebFaultException de retour CustomException?
J'ai fait mon exception personnalisée qui sera lancée à l'intérieur try-catch chaque fois qu'une erreur est survenue:
[Serializable]
public class CustomException : Exception
{
public CustomException() { }
public CustomException(string message)
: base(message) { }
public CustomException(string message, Exception innerException)
: base(message, innerException) { }
}
J'ai deux services, REST et SOAP. Pour le SAVON services, je n'ai pas de problème sur le lancement de mon personnalisée d'exception.
Mais dans le RESTE, j'ai rencontré beaucoup de difficultés.
Voici la méthode pour lancer un WebFaultException:
public static WebFaultException RestGetFault(ServiceFaultTypes fault)
{
ServiceFault serviceFault = new ServiceFault();
serviceFault.Code = (int)fault;
serviceFault.Description = ConfigAndResourceComponent.GetResourceString(fault.ToString());
FaultCode faultCode = new FaultCode(fault.ToString());
FaultReasonText faultReasonText = new FaultReasonText(serviceFault.Description);
FaultReason faultReason = new FaultReason(faultReasonText);
WebFaultException<ServiceFault> webfaultException = new WebFaultException<ServiceFault>(serviceFault, HttpStatusCode.InternalServerError);
throw webfaultException;
}
ServiceFault est une classe où il a certaines propriétés qui je utiliser pour mettre toutes les informations dont j'ai besoin.
J'utilise cette méthode lève une exception à l'intérieur de REPOS de service:
public static CustomException GetFault(ServiceFaultTypes fault)
{
string message = fault.ToString();
CustomException cusExcp = new CustomException(message, new Exception(message));
throw cusExcp;
}
Un échantillon de Service REST (journal de la méthode):
[WebInvoke(UriTemplate = "Login", Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
public Session Login(ClientCredentials client, LogCredentials loginfo)
{
try
{
//Login process
return copied;
}
catch (LogicClass.CustomException ex)
{
LogicClass.RestGetFault(LogicClass.EnumComponent.GetServiceFaultTypes(ex.Message));
throw ex;
}
}
Le MVC partie:
Contrôleur:
[HttpPost]
public ActionResult Login(LoginCredentials loginfo)
{
try
{
string param = "{\"client\":" + JSonHelper.Serialize<ClientAuthentication>(new ClientAuthentication() { SessionID = Singleton.ClientSessionID })
+ ", \"loginfo\":" + JSonHelper.Serialize<LoginCredentials>(loginfo) + "}";
string jsonresult = ServiceCaller.Invoke(Utility.ConstructRestURL("Authenticate/Login"), param, "POST", "application/json");
UserSessionDTO response = JSonHelper.Deserialize<UserSessionDTO>(jsonresult);
}
catch (Exception ex)
{
return Json(new
{
status = ex.Message,
url = string.Empty
});
}
return Json(new
{
status = "AUTHENTICATED",
url = string.IsNullOrWhiteSpace(loginfo.r) ? Url.Action("Index", "Home") : loginfo.r
});
}
- Je utiliser ServiceCaller.Appeler pour appeler l'API REST et récupérer la réponse:
ServiceCaller.cs
public class ServiceCaller
{
public static string Invoke(string url, string parameters, string method, string contentType)
{
string results = string.Empty;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(url));
request.Method = method;
request.ContentType = contentType;
if (!string.IsNullOrEmpty(parameters))
{
byte[] byteArray = Encoding.UTF8.GetBytes(parameters);
request.ContentLength = byteArray.Length;
Stream dataStream = request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
}
try
{
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (HttpStatusCode.OK == response.StatusCode)
{
Stream responseStream = response.GetResponseStream();
int length = (int)response.ContentLength;
const int bufSizeMax = 65536;
const int bufSizeMin = 8192;
int bufSize = bufSizeMin;
if (length > bufSize) bufSize = length > bufSizeMax ? bufSizeMax : length;
byte[] buf = new byte[bufSize];
StringBuilder sb = new StringBuilder(bufSize);
while ((length = responseStream.Read(buf, 0, buf.Length)) != 0)
sb.Append(Encoding.UTF8.GetString(buf, 0, length));
results = sb.ToString();
}
else
{
results = "Failed Response : " + response.StatusCode;
}
}
catch (Exception exception)
{
throw exception;
}
return results;
}
}
Je m'attends à ce que le RESTE de retour de ce côté client:
Mais à la fin, il retourne toujours à ceci:
Que dois-je faire? S'il vous plaît aider.
MODIFIER
Voici un exemple de réponse lorsque vous appelez le service soap:
[FaultException: InvalidLogin]
System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) +9441823
Avez-vous vu le InvalidLogin" ? C'est ce que je veux voir sur la réponse de REPOS servivce.
Exemple de réponse de REPOS:
[WebException: The remote server returned an error: (500) Internal Server Error.]
System.Net.HttpWebRequest.GetResponse() +6115971
Je jette un WebFaultException
mais je reçois un WebException
.
Si je ne vais pas être en mesure de récupérer le message d'erreur exact sur le RESTE, je vais aller pour le SAVON.
Merci pour les réponses.
Est-ce un service WCF et si oui, est votre configuration mis en place pour les erreurs de retour pour le client?
Je suis à la recherche pour le même type de réponse...je n'arrive pas à comprendre comment faire un REPOS, comme gestionnaire, qui lève une exception significative. En fait j'ai juste à régler avec mon code JavaScript à l'aide de la textStatus comme une réussite ou d'échec.
OriginalL'auteur fiberOptics | 2012-05-29
Vous devez vous connecter pour publier un commentaire.
Lors de l'utilisation de
HttpWebRequest
(ou un client de Javascript), votre exception personnalisée n'a pas de sens pour eux. Juste codes d'erreur Http(comme 500 erreur Interne du serveur) et les données dans la réponse du contenu.De sorte que vous avez à gérer l'exception par vous-même. Par exemple, si vous attrapez
WebException
vous pouvez lire le contenu(le message d'erreur) au format Xml ou Json en fonction de vos configurations de serveur.Si vous avez lu la réponse, vous devriez voir votre message personnalisé.(peut-être, dans certains de formulaire xml) Lancer une exception personnalisée avec ce message est quelque chose que vous devriez poignée sur le côté client. Si vous avez mis en place votre base de savon client avec pure HttpWebClient vous avez le même problème aussi.
OriginalL'auteur L.B
J'ai juste eu le même problème quelques minutes en arrière. Peut-être que ça aide. J'ai essayé d'utiliser une extension pour tous mes appels de service comme ci-dessous:
Ici est la MAUVAIS morceau de code:
Ici est la FIXE morceau de code:
Alors... vous avez Probablement remarqué que la première
throw
, est traité dans lecatch (Exception ex)
bloc qui jette à nouveau, en ce qu'il affiche toujours: 'Erreur de Serveur Interne' . Peut-être que ça aide, parce que je vois que vous avez aussi unqui pourrait en être la cause.
OriginalL'auteur Learner
1) Ajouter faultcontract de la méthode/de l'opération
2) Lancer WebFaultException ou WebFaultException
3) Sur le côté Client attraper dans webexception et puis lire l'exception de réponse
Même problème que mentionné dans l'énoncé du problème et en mesure de résoudre avec la réponse évoquée par L. B et suivie de quelques autres postes. Donc pour résumer les étapes suivies
OriginalL'auteur Mahesh Malpani