protected void ValidateOperation (OperationDescription operation)
{
var wai = operation.GetWebAttributeInfo ();
if (wai.Method == "GET")
return;
var style = GetBodyStyle (wai);
// if the style is wrapped there won't be problems
if (style == WebMessageBodyStyle.Wrapped)
return;
string [] parameters;
if (wai.UriTemplate != null) {
// find all variables in the URI
var uri = new UriTemplate (wai.UriTemplate);
parameters = new string [uri.PathSegmentVariableNames.Count + uri.QueryValueVariableNames.Count];
uri.PathSegmentVariableNames.CopyTo (parameters, 0);
uri.QueryValueVariableNames.CopyTo (parameters, uri.PathSegmentVariableNames.Count);
// sort because Array.BinarySearch is the easiest way for case-insensitive search
Array.Sort (parameters, StringComparer.InvariantCultureIgnoreCase);
} else
parameters = new string [0];
bool hasBody = false;
foreach (var msg in operation.Messages) {
if (msg.Direction == MessageDirection.Input) {
// the message is for a request
// if requests are wrapped there is nothing to check
if (style == WebMessageBodyStyle.WrappedRequest)
continue;
foreach (var part in msg.Body.Parts) {
if (Array.BinarySearch (parameters, part.Name, StringComparer.InvariantCultureIgnoreCase) < 0) {
// this part of the message is not covered by a variable in the URI
// so it must be passed in the body
if (hasBody)
throw new InvalidOperationException (String.Format ("Operation '{0}' has multiple message body parts. Add parameters to the UriTemplate or change the BodyStyle to 'Wrapped' or 'WrappedRequest' on the WebInvoke/WebGet attribute.", operation.Name));
hasBody = true;
}
}
} else {
// the message is for a response
if (style != WebMessageBodyStyle.WrappedResponse && msg.Body.Parts.Count > 0)
throw new InvalidOperationException (String.Format ("Operation '{0}' has output parameters. BodyStyle must be 'Wrapped' or 'WrappedResponse' on the operation WebInvoke/WebGet attribute.", operation.Name));
}
}
}