1

ServiceStack で構築された単純なサービスがあります

public class GetContactMasterDataService : IService<GetContactMasterData>
{
    public object Execute(GetContactMasterData getContactMasterData)
    {            
        return ContactApi.FetchContactMasterData();
    }
}

別の名前空間で:

public class GetContactMasterData
{

}

public class GetContactMasterDataResponse
{
    public ResponseStatus ResponseStatus { get; set; }
}

public static GetContactMasterDataResponse FetchContactMasterData()
{
    throw new ApplicationException("CRASH");
}

JSON リクエストを送信すると、次のように正しく取得されます。

{
  "ResponseStatus":{
  "ErrorCode":"ApplicationException",
  "Message":"CRASH",
}
}

soapUI で soap12 リクエストを送信すると、典型的な黄色の死の画面が表示されます

<html>
<head>
    <title>CRASH</title>
...
<h2> <i>CRASH</i> </h2></span>
<b> Description: </b>An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
...
<b> Exception Details: </b>System.ApplicationException: CRASH<br><br>

これは予想される動作ですか?JSON 応答に似たきちんとシリアル化された ResponseStatus を取得するにはどうすればよいですか。

前もって感謝します。

4

1 に答える 1

1

表示される HTML エラー ページは、 ServiceStackから来ているようには見えません。Webサイトに独自のページでエラーを乗っ取っている可能性のあるものがないか確認してください<customErrors />

SOAP エンドポイントの正しい動作は、SOAP エラーをスローすることです。Soap11ServiceClientまたはSoap12ServiceClient 汎用サービス クライアントWebServiceExceptionを使用している場合は、この統合テストで見られるように に変換されます。

var client = new Soap12ServiceClient(ServiceClientBaseUri);
try
{
    var response = client.Send<AlwaysThrowsResponse>(
        new AlwaysThrows { Value = TestString });

    Assert.Fail("Should throw HTTP errors");
}
catch (WebServiceException webEx)
{
    var response = (AlwaysThrowsResponse) webEx.ResponseDto;
    var expectedError = AlwaysThrowsService.GetErrorMessage(TestString);
    Assert.That(response.ResponseStatus.ErrorCode,
        Is.EqualTo(typeof(NotImplementedException).Name));
    Assert.That(response.ResponseStatus.Message,
        Is.EqualTo(expectedError));
}
于 2012-08-14T22:17:00.227 に答える