Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在多个方法中找到WCF Web API模板元素_Wcf_Rest_Dry_Uritemplate_Wcf Web Api - Fatal编程技术网

在多个方法中找到WCF Web API模板元素

在多个方法中找到WCF Web API模板元素,wcf,rest,dry,uritemplate,wcf-web-api,Wcf,Rest,Dry,Uritemplate,Wcf Web Api,假设我正在使用新的WCF Web API构建一个RESTful服务,并且在我的服务中,我有一个URI部分将描述目标资源,但是(几乎)用于契约的所有方法。例如,如果我有一个处理电子商务的用户服务,可能看起来像: [ServiceContract] public class MyUserService { private MyUserRepository _UserRepo; private MyOrganizationRepository _OrgRepo; [WebGe

假设我正在使用新的WCF Web API构建一个RESTful服务,并且在我的服务中,我有一个URI部分将描述目标资源,但是(几乎)用于契约的所有方法。例如,如果我有一个处理电子商务的用户服务,可能看起来像:

[ServiceContract]
public class MyUserService
{
    private MyUserRepository _UserRepo;
    private MyOrganizationRepository _OrgRepo;

    [WebGet (UriTemplate = "{OrganizationName}/Users")]
    public IEnumerable<User> GetUsers (string OrganizationName)
    {
        IEnumerable<User> Users = null;
        var Organization = _OrgRepo.GetOrgByName (OrganizationName);

        if (Organization != null)
        {
            Users = Organization.GetUsers ();
        }
        else
        {
            throw new WebFaultException<string> ("Organization not found.", HttpStatusCode.NotFound);
        }

        return Users;
    }

    [WebInvoke (UriTemplate = "{OrganizationName}/Users", /*yada...yada...yada*/)]
    public User AddNewUser (string OrganizationName, User User)
    {
        // Find the organization, like above, and throw if null.
    }
}
[服务合同]
公共类MyUserService
{
私有MyUserRepository\u UserRepo;
私人MyOrganizationRepository\u OrgRepo;
[WebGet(UriTemplate=“{OrganizationName}/Users”)]
公共IEnumerable GetUsers(字符串OrganizationName)
{
IEnumerable Users=null;
var Organization=_OrgRepo.GetOrgByName(OrganizationName);
if(组织!=null)
{
Users=Organization.GetUsers();
}
其他的
{
抛出新的WebFaultException(“未找到组织”,HttpStatusCode.NotFound);
}
返回用户;
}
[WebInvoke(UriTemplate=“{OrganizationName}/Users”,/*yada…yada…yada*/)]
公共用户AddNewUser(字符串OrganizationName,用户)
{
//找到组织,如上所述,如果为null则抛出。
}
}
如果我必须不断地加载组织并测试null,这将使我的代码陷入困境,而且不是很枯燥。(忍不住要直截了当地说…)我想做的是在MyUserService类中加载一个属性,该属性在URI中包含{OrganizationName}时填充,否则抛出WebFaultException。因为这是URI的一部分,所以实现这一点的最佳方法是什么

编辑:

对于那些可能感兴趣的人,这里是我提出的HttpOperationHandler的一个示例。似乎没有太多关于这方面的信息。我还发现,WCF Web Api套件将提供更多关于这方面的信息,看起来他们将更好地处理这类事情,取代HttpOperationHandler,而且似乎它们可能更易于使用。(这只是一个例子,涵盖了一些我发现很难找到的东西。我在应用程序中写的有点不同。)

使用Microsoft.ApplicationServer.Http.Dispatcher;//对于HttpOperationHandler
使用Microsoft.ApplicationServer.Http.Description;//用于HttpOperationHandlerFactory
公共类OrganizationHandler:HttpOperationHandler
{
私有存储库——组织存储库;
公共组织处理人(工作单位)
:base(“组织名称”)
{
_OrganizationRepository=Work.Organizations;
}
公共覆盖组织OnHandle(字符串OrganizationName)
{
var Result=\u OrganizationRepository
.Get(O=>O.UrlSafeName.Equals(OrganizationName,
StringComparison.InvariantCultureInogoreCase);
如果(结果==null)
{
抛出新的WebFaultException(“未找到组织”);
}
返回结果;
}
}
公共类组织HandlerFactory:HttpOperationHandlerFactory
{
私人工作单位;
公共组织手工业(工作单位)
{
_工作=工作;
}
受保护的重写集合OnCreateRequestHandlers
(ServiceEndpoint端点,HttpOperationDescription操作)
{
var Collection=base.OnCreateRequestHandlers(端点,操作);
if(operation.InputParameters.Any(IP=>IP.Type.Equals(typeof(Organization)))
{
var Binding=endpoint.Binding为HttpBinding;
if(绑定!=null)
{
添加(新的OrganizationHandler(_Work));
}
}
回收;
}
}
然后将其连接到Global.asax(我正在为IoC使用Ninject):

//添加此引用以获取MapServiceRoute扩展
使用Microsoft.ApplicationServer.Http.Activation;
公共类全局:HttpApplication
{
受保护的无效应用程序\u启动(对象发送方,事件参数e)
{
var-Kernel=BuildKernel();
var Config=HttpHostConfiguration.Create()
.设置操作手柄工厂
(Kernel.Get(typeof(OrganizationHandlerFactory))作为OrganizationHandlerFactory)
.SetResourceFactory(新的NinjectResourceFactory(内核));
RouteTable.Routes.MapServiceRoute(“组织”,配置);
}
受保护的IKernel BuildKernel()
{
IKernel Kernel=new Ninject.StandardKernel();
//加载内核
返回内核;
}
}
公共类NinjectResourceFactory:IResourceFactory
{
私有只读IKernel_内核;
公共资源工厂(IKernel内核)
{
_内核=内核;
}
公共对象GetInstance(类型serviceType、InstanceContext、InstanceContext、HttpRequestMessage请求)
{
返回解析(serviceType);
}
public void ReleaseInstance(InstanceContext InstanceContext,对象服务)
{
抛出新的NotImplementedException();
}
私有对象解析(类型)
{
返回_Kernel.Get(类型);
}
}
这是我的服务:

[ServiceContract]
[ServiceBehavior (InstanceContextMode = InstanceContextMode.PerCall)]
public class OrganizationService
{
    [WebGet (UriTemplate = "{OrganizationName}/Products")]
    public IEnumerable<Product> GetProducts (Organization Organization)
    {
        return Organization.Products;
    }
}
[服务合同]
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)]
公共班级组织服务
{
[WebGet(UriTemplate=“{OrganizationName}/Products”)]
公共IEnumerable GetProducts(组织)
{
退货组织、产品;
}
}

这正是OperationHandler的用途。您可以创建一个OperationHandler,将URI参数转换为强类型对象,您可以将其作为操作的参数接受。

Processor只是操作的旧名称HttpOperationHandler@Darrel米勒-谢谢!我正在努力跟上所有的变化,缺乏信息(可以理解)也与其他“WCF REST”链接混合在一起,这使得它变得相当困难。谢谢你
// Add this reference to get the MapServiceRoute<T> extension
using Microsoft.ApplicationServer.Http.Activation;

public class Global : HttpApplication
{
    protected void Application_Start (object sender, EventArgs e)
    {
        var Kernel = BuildKernel ();

        var Config = HttpHostConfiguration.Create ()
            .SetOperationHandlerFactory
                (Kernel.Get (typeof (OrganizationHandlerFactory)) as OrganizationHandlerFactory)
            .SetResourceFactory (new NinjectResourceFactory (Kernel));


        RouteTable.Routes.MapServiceRoute<OrganizationService> ("Organizations", Config);
    }

    protected IKernel BuildKernel ()
    {
        IKernel Kernel = new Ninject.StandardKernel ();

        // Load up the Kernel

        return Kernel;
    }
}

public class NinjectResourceFactory : IResourceFactory
{
    private readonly IKernel _Kernel;

    public NinjectResourceFactory (IKernel Kernel)
    {
        _Kernel = Kernel;
    }

    public object GetInstance (Type serviceType, InstanceContext instanceContext, HttpRequestMessage request)
    {
        return Resolve (serviceType);
    }

    public void ReleaseInstance (InstanceContext instanceContext, object service)
    {
        throw new NotImplementedException ();
    }

    private object Resolve (Type type)
    {
        return _Kernel.Get (type);
    }
}
[ServiceContract]
[ServiceBehavior (InstanceContextMode = InstanceContextMode.PerCall)]
public class OrganizationService
{
    [WebGet (UriTemplate = "{OrganizationName}/Products")]
    public IEnumerable<Product> GetProducts (Organization Organization)
    {
        return Organization.Products;
    }
}