什么是(非SOAP,非WSDL)Web服务项目的最佳ASP.NET文件类型?

时间:2008-09-25 18:59:08

标签: c# asp.net web-services

自VS 2003以来没有完成ASP.NET开发,所以我想节省一些时间并从其他错误中吸取教训。

编写Web服务应用程序,但不编写WSDL / SOAP /等。 - 更像是REST + XML。

如果我想通过相同的URI分别处理不同的HTTP谓词,那么许多“新项目”选项(Web窗体,通用处理程序,ASP.NET处理程序等)中的哪一个最有意义。在一个完美的世界中,我希望在代码中以声明方式完成调度,而不是通过web.config - 但如果我以这种方式过度努力,我愿意改变。

4 个答案:

答案 0 :(得分:2)

如果您没有使用内置的Web服务( .asmx),那么您应该使用通用处理程序( .ashx)。

答案 1 :(得分:1)

这是我一直在玩的一个想法...使用风险自负,代码在我的“Sandbox”文件夹中;)

我想我不想使用反射来确定运行哪种方法,使用HttpVerb作为键在字典中注册委托可能会更快。无论如何,这个代码没有保修,等等,等等,等等......

与REST服务一起使用的动词

public enum HttpVerb
{
    GET, POST, PUT, DELETE
}

标记服务方法的属性

[AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited=false)]
public class RestMethodAttribute: Attribute
{
    private HttpVerb _verb;

    public RestMethodAttribute(HttpVerb verb)
    {
        _verb = verb;
    }

    public HttpVerb Verb
    {
        get { return _verb; }
    }
}

休息服务的基类

public class RestService: IHttpHandler
{
    private readonly bool _isReusable = true;
    protected HttpContext _context;
    private IDictionary<HttpVerb, MethodInfo> _methods;

    public void ProcessRequest(HttpContext context)
    {
        _context = context;

        HttpVerb verb = (HttpVerb)Enum.Parse(typeof (HttpVerb), context.Request.HttpMethod);

        MethodInfo method = Methods[verb];

        method.Invoke(this, null);
    }

    private IDictionary<HttpVerb, MethodInfo> Methods
    {
        get
        {
            if(_methods == null)
            {
                 _methods = new Dictionary<HttpVerb, MethodInfo>();
                BuildMethodsMap();
            }
            return _methods;
        }
    }

    private void BuildMethodsMap()
    {
        Type serviceType = this.GetType();
        MethodInfo[] methods = serviceType.GetMethods(BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Public);

        foreach (MethodInfo info in methods)
        {
            RestMethodAttribute[] attribs =
                info.GetCustomAttributes(typeof(RestMethodAttribute), false) as RestMethodAttribute[];
            if(attribs == null || attribs.Length == 0)
                continue;

            HttpVerb verb = attribs[0].Verb;

            Methods.Add(verb, info);
        }

    }

    public bool IsReusable
    {
        get { return _isReusable; }
    }
}

REST服务示例

public class MyRestService: RestService
{
    [RestMethod(HttpVerb.GET)]
    public void HelloWorld()
    {
        _context.Current.Response.Write("Hello World");
        _context.Current.Response.End();
    }
}

答案 2 :(得分:0)

如果你需要休息,可能是MVC。

答案 3 :(得分:0)

我同意ashx,给你最大的控制权。你也可以更复杂并创建一个自定义的Http Handler。这样你就可以拦截你决定的任何扩展。当然,您可以添加Http模块并将任何请求重写为通用的ashx处理程序。