Поймать детали WebFaultException в WCF Rest - PullRequest
3 голосов
/ 13 октября 2010

У меня есть сервер, который выбрасывает WebFaultException

try
{
    ...
}
catch (InvalidPasswordException)
{

    throw new WebFaultException<String>
                   ("This is a bad password", 
                    HttpStatusCode.Unauthorized);
}

Пока все хорошо.Однако, когда этот WebFault обнаруживается в другом проекте C # (клиент), я не знаю, как получить подробности.

try
{
    HttpWebRequest httpWebRequest = WebRequest.Create(uri) as HttpWebRequest;

    httpWebRequest.Method = verb;
    httpWebRequest.ContentType = "text/xml";
    httpWebRequest.ContentLength = serializedPayload.Length;

    using (StreamWriter streamOut = new StreamWriter(httpWebRequest.GetRequestStream(), Encoding.ASCII))
    {
        streamOut.Write(serializedPayload);
        streamOut.Close();
    }

    // error here on GetResponseStream
    using (StreamReader streamIn = new StreamReader(httpWebRequest.GetResponse().GetResponseStream()))
    {
            string strResponse = streamIn.ReadToEnd();
            streamIn.Close();
            return strResponse;
    }
}
catch (Exception e)
{
   // The exception is of type WebException with unauthorized but don't know where the details are
}

Этот код перехватывает исключение WebException, для которого я не могу найти подробности, простонесанкционированный.

Спасибо

ОБНОВЛЕНИЕ 1: Когда я делаю запрос в фиддлере, тело ответа - это деталь, но поскольку это исключение выдается до того, как тело ответа когда-либо будет прочитано, тогда ононе появляетсяИтак, вопрос в том, как мне прочитать тело ответа, несмотря на то, что выброшено не 200.

Ответ Fiddler Raw:

HTTP/1.1 401 Unauthorized
Server: ASP.NET Development Server/10.0.0.0
Date: Tue, 12 Oct 2010 22:42:31 GMT
X-AspNet-Version: 4.0.30319
Content-Length: 100
Cache-Control: private
Content-Type: application/xml; charset=utf-8
Connection: Close

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Email/Password Mismatch</string>

Ответы [ 3 ]

4 голосов
/ 13 октября 2010

Я просто догадываюсь, но я думаю, что вам просто нужно проверить член .StatusCode результата GetResponse () и не пытаться вызывать GetResponseStream (), если это не 200. Если это код ошибки (401 вваш случай), то подробности ошибки должны быть в .Content члене GetResponse ().

Что-то вроде:

var r = httpWebRequest.GetResponse();
if(r.StatusCode != 200)
{
    MessageBox.Show(r.Content); // Display the error 
}
else
{
    var streamIn = new StreamReader(r.GetResponseStream());
    string strResponse = streamIn.ReadToEnd();
    streamIn.Close();
    return strResponse;
}
3 голосов
/ 13 октября 2010

У WebException есть свойство Response, которое вы можете привести к HttpWebResponse и затем вызвать GetResponseStream.

В связанной заметке возьмите себе библиотеку Microsoft.Http из стартового комплекта WCF REST. Это намного лучшая клиентская библиотека, чем HttpWebRequest / Response. Для более подробной информации, у меня есть несколько сообщений в блоге здесь: http://www.bizcoder.com/index.php/2009/12/08/why-the-microsoft-http-library-is-awesome/

0 голосов
/ 13 февраля 2014

Я использовал это

 try
            {
              //wcf service call
            }
            catch (FaultException ex)
            {
               throw new Exception( (ex as WebFaultException<MyContractApplicationFault>).Detail.MyContractErrorMessage );                
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...