コード例 #1
0
        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'.");
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
        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());
        }