forked from ServiceStack/ServiceStack
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathServiceUtils.cs
More file actions
127 lines (108 loc) · 4.68 KB
/
Copy pathServiceUtils.cs
File metadata and controls
127 lines (108 loc) · 4.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
using System;
using System.Net;
using System.Runtime.Serialization;
using ServiceStack.Common.Utils;
using ServiceStack.Common.Web;
using ServiceStack.ServiceHost;
using ServiceStack.ServiceInterface.ServiceModel;
using ServiceStack.Text;
using ServiceStack.Validation;
namespace ServiceStack.ServiceInterface
{
public static class ServiceUtils
{
/// <summary>
/// Naming convention for the ResponseStatus property name on the response DTO
/// </summary>
public const string ResponseStatusPropertyName = "ResponseStatus";
/// <summary>
/// Naming convention for the request's Response DTO
/// </summary>
public const string ResponseDtoSuffix = "Response";
public static object CreateErrorResponse<TRequest>(TRequest request, ValidationErrorResult validationError)
{
var responseStatus = ResponseStatusTranslator.Instance.Parse(validationError);
var errorResponse = CreateErrorResponse(
request,
new ValidationError(validationError),
responseStatus);
return errorResponse;
}
public static object CreateErrorResponse<TRequest>(TRequest request, Exception ex, ResponseStatus responseStatus)
{
var responseDto = CreateResponseDto(request, responseStatus);
var httpError = ex as IHttpError;
if (httpError != null)
{
if (responseDto != null)
httpError.Response = responseDto;
return httpError;
}
var errorCode = ex.GetType().Name;
var errorMsg = ex.Message;
if (responseStatus != null)
{
errorCode = responseStatus.ErrorCode ?? errorCode;
errorMsg = responseStatus.Message ?? errorMsg;
}
return new HttpError(responseDto, ex.ToStatusCode(), errorCode, errorMsg);
}
/// <summary>
/// Create an instance of the service response dto type and inject it with the supplied responseStatus
/// </summary>
/// <param name="request"></param>
/// <param name="responseStatus"></param>
/// <returns></returns>
public static object CreateResponseDto<TRequest>(TRequest request, ResponseStatus responseStatus)
{
// Predict the Response message type name
// Get the type
var responseDtoType = AssemblyUtils.FindType(GetResponseDtoName(request));
var responseDto = CreateResponseDto(request);
if (responseDto == null)
return null;
// For faster serialization of exceptions, services should implement IHasResponseStatus
var hasResponseStatus = responseDto as IHasResponseStatus;
if (hasResponseStatus != null)
{
hasResponseStatus.ResponseStatus = responseStatus;
}
else
{
// Get the ResponseStatus property
var responseStatusProperty = responseDtoType.GetProperty(ResponseStatusPropertyName);
if (responseStatusProperty != null)
{
// Set the ResponseStatus
ReflectionUtils.SetProperty(responseDto, responseStatusProperty, responseStatus);
}
}
// Return an Error DTO with the exception populated
return responseDto;
}
/// <summary>
/// Create an instance of the response dto based on the requestDto type and default naming convention
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public static object CreateResponseDto<TRequest>(TRequest request)
{
// Get the type
var responseDtoType = AssemblyUtils.FindType(GetResponseDtoName(request));
if (responseDtoType == null)
{
// We don't support creation of response messages without a predictable type name
return null;
}
// Create an instance of the response message for this request
var responseDto = ReflectionUtils.CreateInstance(responseDtoType);
return responseDto;
}
public static string GetResponseDtoName<TRequest>(TRequest request)
{
return typeof(TRequest) != typeof(object)
? typeof(TRequest).FullName + ResponseDtoSuffix
: request.GetType().FullName + ResponseDtoSuffix;
}
}
}