Click here to Skip to main content
15,886,689 members
Articles / Web Development / IIS

Build ReST based Web Services in .NET/C#

Rate me:
Please Sign up or sign in to vote.
5.00/5 (12 votes)
12 Jul 2009CPOL2 min read 122.6K   5.5K   55  
A ReST based Web Service for C#.
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;

namespace PoC.Web.Services.Utilities
{
    internal class ReflectionUtil
    {
        public static MethodInfo FindMethod(Type inType, string methodName, object[] args, HttpVerb verb)
        {
            int matchMethodCounter = 0;
            MethodInfo retMethod = null;
            foreach (System.Reflection.MethodInfo method in inType.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.IgnoreCase))
            {
                bool isMatch = true;
                bool isExactMatch = true;
                try
                {
                    if (method.GetCustomAttributes(typeof(ReSTMethod), false).Length == 0) continue;
                    bool isVerbSupported = false;
                    foreach (ReSTMethod methodAttrib in (ReSTMethod[])method.GetCustomAttributes(typeof(ReSTMethod), false))
                    {
                        isVerbSupported |= methodAttrib.Verb == verb;
                    }
                    if (!isVerbSupported) continue;

                    if (string.Compare(method.Name, methodName, StringComparison.OrdinalIgnoreCase) != 0) continue;
                    ParameterInfo[] methodParam = method.GetParameters();
                    if (methodParam.Length == 0 && args.Length == 0) return method;
                    //if (methodParam.Length == 0) throw new InvalidOperationException("Method doesn't support any parameter");
                    //No support for "params"
                    if (methodParam[methodParam.Length - 1].GetCustomAttributes(typeof(ParamArrayAttribute), false).Length > 0)
                        throw new InvalidOperationException("Param Array not allowed.");
                    if (methodParam.Length > args.Length)
                    {
                        object[] resizeArgs = new object[args.Length];
                        System.Array.Copy(args, resizeArgs, args.Length);
                        args = resizeArgs;
                    }


                    for (int i = 0; i < methodParam.Length; i++)
                    {
                        Type paramType = methodParam[i].ParameterType;
                        object paramValue = args[i];
                        if ((paramValue == null && paramType.IsValueType)
                            || (paramValue != null && !paramType.IsAssignableFrom(paramValue.GetType())))
                        {
                            isMatch = false;
                            break;
                        }
                        if (paramValue == null || paramType != paramValue.GetType())
                        {
                            isExactMatch = false;
                        }
                    }
                }
                catch (InvalidCastException)
                {
                    isMatch = false;
                }
                if (isMatch)
                {
                    if(isExactMatch)
                        return method;
                    ++matchMethodCounter;
                    retMethod = method;
                    if (matchMethodCounter > 0) throw new AmbiguousMatchException("Ambiguous action.");
                }
                
            }
            return retMethod;
        }
    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
United States United States
Loves coding...

Comments and Discussions