Frage

Ich habe einen WCF-Webdienst, der löst Ausnahmen aus, wenn ungültige Daten eingereicht.Die Daten gesendet werden über einen HTTP-Post mit der WebClient-Objekt.

Hier ist der code für den web-service:

[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 ...
}

Und hier ist der code, der übermittelt die Daten an den web-service:

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

Ich erhalte eine Ausnahme mit der Meldung: "The remote server returned an error: (500) Internal Server Error" am client.UploadValues(this.Address, data);.

Gibt es eine Möglichkeit, ich kann machen sicher, dass weitere detaillierte Informationen zurückgegeben werden, die WebClient?

Auch, wie kann ich machen sicher, dass diese Ausnahmen (in der WCF-service) angemeldet sind, um das EventLog?(Grundsätzlich muss ich nur wissen, was passiert ist).

War es hilfreich?

Lösung

Werfen Sie einen Blick auf HttpResponseException (namespace Microsoft.ApplicationServer.Http.Dispatcher) - Sie sind die Art, wo Sie kontrollieren kann, die Antwort für Fehler-Fälle.Sie können angeben, status-code, und Sie haben die Kontrolle über die HttpResponseMessage, in die Sie kontrollieren können, den Nachrichtentext.

Auf der client-Seite, wenn Sie anrufen WebClient.UploadValues, wickeln, dass die Gesprächs-und catch-a WebException.Wenn der Dienst sendet eine Antwort mit einer nicht-erfolgreichen-status-code (z.B., 500, 400), die Response Eigenschaft des WebException haben die Körper, in denen Sie Lesen können, die in Ihrem client.

Eine andere option ist zu verwenden HttpClient anstelle der WebClient, in diesem Fall können Sie Sie einfach mal auf die HttpResponseMessage direkt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top