public void GetHttpMethod_Returns_HttpMethod() { ExceptionAssert.ThrowsArgumentNull("operation", () => ((HttpOperationDescription)null).GetHttpMethod()); ContractDescription contract = ContractDescription.GetContract(typeof(WebMethodService)); OperationDescription operationDescription = contract.Operations.Where(od => od.Name == "NoAttributeOperation").FirstOrDefault(); HttpOperationDescription httpOperationDescription = operationDescription.ToHttpOperationDescription(); Assert.AreEqual(HttpMethod.Post, httpOperationDescription.GetHttpMethod(), "HttpOperationDescription.GetHttpMethod should return 'POST' for operations with no WebGet or WebInvoke attribute."); operationDescription = contract.Operations.Where(od => od.Name == "WebInvokeOperation").FirstOrDefault(); httpOperationDescription = operationDescription.ToHttpOperationDescription(); Assert.AreEqual(HttpMethod.Post, httpOperationDescription.GetHttpMethod(), "HttpOperationDescription.GetHttpMethod should return 'POST' for operations with WebInvoke attribute but no Method set explicitly."); operationDescription = contract.Operations.Where(od => od.Name == "WebGetOperation").FirstOrDefault(); httpOperationDescription = operationDescription.ToHttpOperationDescription(); Assert.AreEqual(HttpMethod.Get, httpOperationDescription.GetHttpMethod(), "HttpOperationDescription.GetHttpMethod should return 'GET' for operations with WebGet."); operationDescription = contract.Operations.Where(od => od.Name == "WebInvokeGetOperation").FirstOrDefault(); httpOperationDescription = operationDescription.ToHttpOperationDescription(); Assert.AreEqual(HttpMethod.Get, httpOperationDescription.GetHttpMethod(), "HttpOperationDescription.GetHttpMethod should have return 'GET'."); operationDescription = contract.Operations.Where(od => od.Name == "WebInvokeGetLowerCaseOperation").FirstOrDefault(); httpOperationDescription = operationDescription.ToHttpOperationDescription(); Assert.AreEqual(new HttpMethod("Get"), httpOperationDescription.GetHttpMethod(), "HttpOperationDescription.GetHttpMethod should have return 'Get'."); operationDescription = contract.Operations.Where(od => od.Name == "WebInvokePutOperation").FirstOrDefault(); httpOperationDescription = operationDescription.ToHttpOperationDescription(); Assert.AreEqual(HttpMethod.Put, httpOperationDescription.GetHttpMethod(), "HttpOperationDescription.GetHttpMethod should have return 'PUT'."); operationDescription = contract.Operations.Where(od => od.Name == "WebInvokePostOperation").FirstOrDefault(); httpOperationDescription = operationDescription.ToHttpOperationDescription(); Assert.AreEqual(HttpMethod.Post, httpOperationDescription.GetHttpMethod(), "HttpOperationDescription.GetHttpMethod should have return 'POST'."); operationDescription = contract.Operations.Where(od => od.Name == "WebInvokeDeleteOperation").FirstOrDefault(); httpOperationDescription = operationDescription.ToHttpOperationDescription(); Assert.AreEqual(HttpMethod.Delete, httpOperationDescription.GetHttpMethod(), "HttpOperationDescription.GetHttpMethod should have return 'DELETE'."); operationDescription = contract.Operations.Where(od => od.Name == "WebInvokeCustomOperation").FirstOrDefault(); httpOperationDescription = operationDescription.ToHttpOperationDescription(); Assert.AreEqual(new HttpMethod("Custom"), httpOperationDescription.GetHttpMethod(), "HttpOperationDescription.GetHttpMethod should have return 'Custom'."); }
/// <summary> /// Called when the ordered collection of <see cref="HttpOperationHandler"/> instances is being created for /// the given <paramref name="operation"/>. Can be overridden in a derived class to customize the /// collection of <see cref="HttpOperationHandler"/> instances returned. /// </summary> /// <remarks> /// The base implemenation returns the standard request <see cref="HttpOperationHandler"/> instances for the given /// operation. /// </remarks> /// <param name="endpoint">The service endpoint.</param> /// <param name="operation">The description of the service operation.</param> /// <returns> /// The ordered collection of <see cref="HttpOperationHandler"/> instances to use when handling /// <see cref="HttpRequestMessage"/> instances for the given operation. /// </returns> protected virtual Collection <HttpOperationHandler> OnCreateRequestHandlers(ServiceEndpoint endpoint, HttpOperationDescription operation) { if (endpoint == null) { throw Fx.Exception.ArgumentNull("endpoint"); } if (operation == null) { throw Fx.Exception.ArgumentNull("operation"); } Collection <HttpOperationHandler> requestHandlers = new Collection <HttpOperationHandler>(); HttpMethod method = operation.GetHttpMethod(); UriTemplate uriTemplate = operation.GetUriTemplate(); string[] uriTemplateParameterNames = uriTemplate.PathSegmentVariableNames.Concat(uriTemplate.QueryValueVariableNames).ToArray(); if (uriTemplateParameterNames.Length > 0) { requestHandlers.Add(new UriTemplateHandler(endpoint.Address.Uri, uriTemplate)); } if (method != HttpMethod.Get && method != HttpMethod.Head) { HttpParameter requestContentParameter = GetRequestContentHandler(operation, uriTemplateParameterNames); if (requestContentParameter != null) { requestContentParameter.IsContentParameter = true; requestHandlers.Add(new RequestContentHandler(requestContentParameter, this.Formatters)); SetXmlAndJsonSerializers(operation, requestContentParameter, this.Formatters); } } return(requestHandlers); }
public static OperationDescription GetEquivalentOperationDescription(OperationDescription operation) { Fx.Assert(operation != null, "OperationDescription cannnot be null"); OperationDescription copy = CreateEmptyOperationDescription(operation); HttpOperationDescription httpDescription = copy.ToHttpOperationDescription(); HttpOperationDescription originalHttpDescription = operation.ToHttpOperationDescription(); UriTemplate template = originalHttpDescription.GetUriTemplate(); List <string> templateVariables = new List <string>(template.PathSegmentVariableNames.Concat(template.QueryValueVariableNames)); IEnumerable <HttpParameter> originalRequestBodyParameters = originalHttpDescription.InputParameters.Where(param => param.IsContentParameter); IEnumerable <HttpParameter> originalResponseBodyParameters = originalHttpDescription.OutputParameters.Where(param => param.IsContentParameter); IEnumerable <HttpParameter> originalUriTemplateParameters = originalHttpDescription.InputParameters.Where( (param) => { foreach (string templateVariable in templateVariables) { if (string.Equals(templateVariable, param.Name, StringComparison.OrdinalIgnoreCase)) { return(true); } } return(false); }); httpDescription.ReturnValue = originalHttpDescription.ReturnValue; // add UriTemplate parameters foreach (HttpParameter parameter in originalUriTemplateParameters) { httpDescription.InputParameters.Add(parameter); } // add body parameters foreach (HttpParameter parameter in originalRequestBodyParameters) { httpDescription.InputParameters.Add(parameter); } int index = httpDescription.InputParameters.Count; int requestBodyParametersCount = originalRequestBodyParameters.Count <HttpParameter>(); int responseBodyParametersCount = originalResponseBodyParameters.Count <HttpParameter>(); if (requestBodyParametersCount == 0 || responseBodyParametersCount == 0) { // Special case if any input parameter is HttpRequestMessage or HttpResponseMessage foreach (HttpParameter inputParameter in originalHttpDescription.InputParameters) { if (requestBodyParametersCount == 0 && originalHttpDescription.GetHttpMethod() != HttpMethod.Get && httpRequestMessageType.IsAssignableFrom(inputParameter.Type)) { // add the HttpRequestmessage as a body parameter of type Message HttpParameter parameter = new HttpParameter(new MessagePartDescription(inputParameter.Name, string.Empty) { Type = typeof(Message), Index = index++ }); httpDescription.InputParameters.Add(parameter); } if (!operation.IsOneWay && responseBodyParametersCount == 0 && httpResponseMessageType.IsAssignableFrom(inputParameter.Type)) { // add the HttpResponsemessage as a return value of type Message httpDescription.ReturnValue = new HttpParameter(new MessagePartDescription(inputParameter.Name, string.Empty) { Type = typeof(Message) }); } } } foreach (HttpParameter parameter in originalResponseBodyParameters) { // cannot do a byRef comparison here if (parameter.Type != originalHttpDescription.ReturnValue.Type || !string.Equals(parameter.Name, originalHttpDescription.ReturnValue.Name, StringComparison.OrdinalIgnoreCase)) { httpDescription.OutputParameters.Add(parameter); } } if (responseBodyParametersCount == 0) { foreach (HttpParameter outputParameter in originalHttpDescription.OutputParameters) { // special case HttpResponseMessage when it is set as an out parameter if (httpResponseMessageType.IsAssignableFrom(outputParameter.Type)) { httpDescription.ReturnValue = new HttpParameter(new MessagePartDescription(outputParameter.Name, string.Empty) { Type = typeof(Message) }); } } } if (templateVariables.Count > originalUriTemplateParameters.Count <HttpParameter>()) { // this means that we have some UriTemplate variables that are not explicitly bound to an input parameter foreach (HttpParameter parameter in originalUriTemplateParameters) { templateVariables.Remove(parameter.Name); } foreach (string variable in templateVariables) { HttpParameter parameter = new HttpParameter(new MessagePartDescription(variable, operation.DeclaringContract.Namespace) { Type = typeof(string), Index = index++ }); httpDescription.InputParameters.Add(parameter); } } return(httpDescription.ToOperationDescription()); }