Question

J'ai un service Web WCF qui jette des exceptions lorsque est soumis des données non valides. Les données sont soumises via un message HTTP en utilisant l'objet WebClient.

Voici le code pour le service web:

[WebInvoke(UriTemplate = "update", Method = "POST")]
public JsonValue Update(HttpRequestMessage message)
{
    var context = new Entities();
    dynamic response = new JsonObject();

    // in order to retrieve the submitted data easily, reference the data as a dynamic object
    dynamic data = message.Content.ReadAs(typeof(JsonObject), new[] { new FormUrlEncodedMediaTypeFormatter() });

    // retrieve the submitted data
    int requestId = data.requestId;
    int statusId = data.statusId;
    string user = data.user;
    string encryptedToken = data.token;
    string notes = data.notes;

    // retrieve the request with a matching Id
    var request = context.Requests.Find(requestId);

    // make sure the request exists
    if (request == null)
        throw new FaultException("The supplied requestId does not exist.");

    // make sure the submitted encrypted token is valid
    var token = DecryptToken(encryptedToken);
    if (token == null)
        throw new FaultException("Invalid security token.");

    // TODO: Validate other token properties (e.g. email)?
    if (!request.User.UserName.Equals(token.UserName))
        throw new FaultException("Invalid security token.");

    // additional logic removed ...
}

Et voici le code qui envoie des données au service Web:

            // use the WebClient object to submit data to the WCF web service
            using (var client = new WebClient())
            {
                client.Encoding = Encoding.UTF8;

                // the data will be submitted in the format of a form submission
                client.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";

                var data = new NameValueCollection();

                // prepare the data to be submitted
                data.Add("requestId", requestId.ToString());
                data.Add("statusId", this.StatusId);
                data.Add("token", token.ToString());
                data.Add("user", this.User);
                data.Add("notes", this.Notes);

                // submit the data to the web service
                var response = client.UploadValues(this.Address, data);
           }

Je continue à obtenir une exception avec le message:. "The remote server returned an error: (500) Internal Server Error" à client.UploadValues(this.Address, data);

Y at-il une manière que je peux vous assurer que des informations plus détaillées est retourné au WebClient?

En outre, comment puis-je faire en sorte que ces exceptions (dans le service WCF) sont consignés dans le journal des événements? (En fait, je juste besoin de savoir ce qui est arrivé).

Était-ce utile?

La solution

Jetez un oeil à HttpResponseException (espace de noms Microsoft.ApplicationServer.Http.Dispatcher) - ils sont le chemin où vous pouvez contrôler la réponse pour les cas d'erreur. Vous pouvez spécifier le code d'état, et vous avez le contrôle sur le HttpResponseMessage, dans lequel vous pouvez contrôler le corps du message.

Du côté client, lorsque vous appelez WebClient.UploadValues, envelopper cet appel et attraper un WebException. Si les retours de service une réponse avec un code d'état non-succès (par exemple, 500, 400), la propriété Response du WebException aura le corps, dans lequel vous pouvez lire dans votre client.

Une autre option consiste à utiliser HttpClient au lieu du WebClient, dans ce cas, vous pouvez simplement regarder le HttpResponseMessage directement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top