You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中获取WCF REST服务所有方法的UriTemplate

获取WCF REST服务方法的UriTemplate的几种C#实现方式

嘿,我来帮你搞定这个需求——要提取WCF REST服务里所有方法对应的UriTemplate,咱们可以用下面几种实用的方法:

方法一:通过反射直接扫描服务契约特性

因为你的WCF REST方法都是通过[WebInvoke](或[WebGet])特性标记的,其中就包含了UriTemplate属性。咱们可以直接反射服务契约的接口,遍历所有方法并提取这个值。

代码示例

using System;
using System.Reflection;
using System.ServiceModel.Web;

// 假设你的服务契约接口是IProjectService
public class UriTemplateExtractor
{
    public static void ExtractUriTemplates<TContract>()
    {
        Type contractType = typeof(TContract);
        
        // 遍历契约接口的所有方法
        foreach (MethodInfo method in contractType.GetMethods())
        {
            // 获取WebInvoke特性
            WebInvokeAttribute webInvokeAttr = method.GetCustomAttribute<WebInvokeAttribute>();
            if (webInvokeAttr != null && !string.IsNullOrEmpty(webInvokeAttr.UriTemplate))
            {
                Console.WriteLine($"方法 {method.Name} 的UriTemplate: {webInvokeAttr.UriTemplate}");
                Console.WriteLine($"请求方法: {webInvokeAttr.Method}");
            }
            
            // 也别忘了处理WebGet特性的情况
            WebGetAttribute webGetAttr = method.GetCustomAttribute<WebGetAttribute>();
            if (webGetAttr != null && !string.IsNullOrEmpty(webGetAttr.UriTemplate))
            {
                Console.WriteLine($"方法 {method.Name} 的UriTemplate: {webGetAttr.UriTemplate}");
                Console.WriteLine($"请求方法: GET");
            }
        }
    }
}

// 调用方式(替换成你的契约接口)
// UriTemplateExtractor.ExtractUriTemplates<IProjectService>();

说明

  • 你需要确保引用了System.ServiceModel.Web.dll程序集
  • 这里的TContract是你的服务契约接口(比如包含Login方法的那个接口)
  • 这种方式直接读取代码特性,不需要启动服务,适合在开发阶段快速查看

方法二:通过ServiceHost加载服务并提取元数据

如果你的服务已经部署或者可以通过配置文件加载,咱们可以创建ServiceHost实例,然后通过ServiceDescription来获取所有操作的UriTemplate信息,这种方式更贴近WCF的运行时逻辑。

代码示例

using System;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.ServiceModel.Web;

public class ServiceUriTemplateExtractor
{
    public static void ExtractFromServiceHost(string serviceAddress, Type serviceType)
    {
        using (ServiceHost host = new ServiceHost(serviceType, new Uri(serviceAddress)))
        {
            host.Open();
            
            // 遍历所有服务端点
            foreach (ServiceEndpoint endpoint in host.Description.Endpoints)
            {
                // 只处理WebHttpBinding的REST端点
                if (endpoint.Binding is WebHttpBinding)
                {
                    // 遍历端点的所有操作
                    foreach (OperationDescription operation in endpoint.Contract.Operations)
                    {
                        // 获取WebInvoke或WebGet特性
                        WebInvokeAttribute webInvoke = operation.Behaviors.Find<WebInvokeAttribute>();
                        if (webInvoke != null)
                        {
                            Console.WriteLine($"操作 {operation.Name} 的UriTemplate: {webInvoke.UriTemplate}");
                            Console.WriteLine($"请求方法: {webInvoke.Method}");
                        }
                        
                        WebGetAttribute webGet = operation.Behaviors.Find<WebGetAttribute>();
                        if (webGet != null)
                        {
                            Console.WriteLine($"操作 {operation.Name} 的UriTemplate: {webGet.UriTemplate}");
                            Console.WriteLine($"请求方法: GET");
                        }
                    }
                }
            }
            
            host.Close();
        }
    }
}

// 调用方式(替换成你的服务地址和服务实现类)
// ServiceUriTemplateExtractor.ExtractFromServiceHost("http://XXXXXXXX/RestServices/Project.svc", typeof(ProjectService));

说明

  • 需要确保服务的配置正确,或者代码中绑定配置符合REST服务的要求
  • 这种方式需要启动服务实例,适合在测试环境中验证部署后的服务UriTemplate

额外注意事项

  • 不管用哪种方法,都要注意处理UriTemplate为空的情况(有些REST方法可能没有显式设置UriTemplate)
  • 对于你的示例中的Login方法,提取后会得到UriTemplate: UserLogin,完整的请求地址就是http://XXXXXXXX/RestServices/Project.svc/UserLogin

内容的提问来源于stack exchange,提问作者vivek ramasamy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:05:56