- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我正在使用新的 WCF Web API 来构建 RESTful 服务,并且在我的服务中,我有一部分 URI 将描述目标资源,但用于(几乎)契约(Contract)的所有方法。例如,如果我有一个处理电子商务的用户服务,它可能如下所示:
[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.
}
}
using Microsoft.ApplicationServer.Http.Dispatcher; // For HttpOperationHandler
using Microsoft.ApplicationServer.Http.Description; // For HttpOperationHandlerFactory
public class OrganizationHandler : HttpOperationHandler<string, Organization>
{
private Repository<Organization> _OrganizationRepository;
public OrganizationHandler (UnitOfWork Work)
: base ("OrganizationName")
{
_OrganizationRepository = Work.Organizations;
}
public override Organization OnHandle (string OrganizationName)
{
var Result = _OrganizationRepository
.Get (O => O.UrlSafeName.Equals (OrganizationName,
StringComparison.InvariantCultureIgnoreCase));
if (Result == null)
{
throw new WebFaultException<string> ("Organization not found.");
}
return Result;
}
}
public class OrganizationHandlerFactory : HttpOperationHandlerFactory
{
private UnitOfWork _Work;
public OrganizationHandlerFactory (UnitOfWork Work)
{
_Work = Work;
}
protected override Collection<HttpOperationHandler> OnCreateRequestHandlers
(ServiceEndpoint endpoint, HttpOperationDescription operation)
{
var Collection = base.OnCreateRequestHandlers (endpoint, operation);
if (operation.InputParameters.Any (IP => IP.Type.Equals (typeof (Organization))))
{
var Binding = endpoint.Binding as HttpBinding;
if (Binding != null)
{
Collection.Add (new OrganizationHandler (_Work));
}
}
return Collection;
}
}
// 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;
}
}
最佳答案
这正是 OperationHandlers 的用途。您创建一个 OperationHandler,它将 URI 参数转换为一个强类型对象,您可以将其作为操作的参数接受。
关于在多种方法中找到的 WCF Web API UriTemplate 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6066204/
[OperationContract] [WebGet(UriTemplate = "/searchresults/{searchTerm}/{searchType}", ResponseFo
当我使用带有 WebGet 属性的参数注释方法但不提供 UriTemplate 时,WCF Rest 的默认行为是什么?是否存在默认行为或 WCF 根本不响应 GET 请求(这对我来说似乎正在发生)。
WCF 将匹配: http://localhost:8888/test/blahFirst/blahSecond/sdfsdf,wwewe 对此: [OperationContract] [WebGe
我尝试重用相同的 UriTemplate 实例,而不是每次都创建它。但不知道是否线程安全。 最佳答案 UriTemplate 接受 URI 字符串,并将其分解为: private final Stri
我尝试了以下代码: [OperationContract] [WebInvoke(UriTemplate="/Users/Register/{user}")] void Register(Use
我正在使用 WCF 4.0 创建 REST-ful Web 服务。我想要做的是根据 UriTemplate 中的查询字符串参数调用不同的服务方法。 例如,我有一个 API,允许用户使用驾驶执照或社会安
我已经使用了 this thread 中的提示并提供了一个默认值,以便当用户没有指定虚拟子目录时,我假设他的意思是要列出所有内容。它有效。 [OperationContract] [WebInvoke
我正在 WCF 4.0 中开发一些 RESTful 服务。我有一个方法如下: [OperationContract] [WebGet(UriTemplate = "Test?format=XM
这是一种场景,我有一个 WCF 服务调用,它采用一个字符串参数,并且该字符串中包含斜杠(例如“123/456.xml”)。我想设置一个像“/{file}”这样的 UriTemplate,以便我可以访问
我正在使用 .Net Standart for Azure Function,它使用服务总线处理消息。一旦我的函数运行,我遇到了以下异常: Microsoft.ServiceBus: The type
如何编写单元测试来测试我的 WCF 服务中的 UriTemplates(例如 [WebGet(Uritemlpate="{clientId}/returns")]? 例如,在 Global.asax
假设我正在使用新的 WCF Web API 来构建 RESTful 服务,并且在我的服务中,我有一部分 URI 将描述目标资源,但用于(几乎)契约(Contract)的所有方法。例如,如果我有一个处理
我创建了以下 RESTful WCF 服务,它在 VS 中运行时运行良好。 [OperationContract] [WebGet(ResponseFormat = WebMessageFormat.
我有许多 Azure 功能,现在我想将 Azure API 管理放在前面。 我已从帐户中的 2 个或 3 个其他函数应用导入所有函数,没有出现任何问题,但其中一个函数应用出现问题。这个功能应用程序有
如果我可以访问 Uri 和它所基于的 UriTemplate,发现替换模板中参数的值的最巧妙方法是什么? 例如,如果我知道: var uriTemplate = new UriTemp
我有以下映射: @RequestMapping(value = "/{first}/**/{last}", method = RequestMethod.GET) public String test
我有一个带有以下 API 的 RESTful WCF 网络服务: [WebGet(ResponseFormat = WebMessageFormat.Json)] MyResponseContract
这些我都试过了 Optional Parameters in WCF Service URI Template?Posted by Kamal Rawat in Blogs | .NET 4.5 on
我可以执行以下操作吗? [OperationContract] [WebGet(UriTemplate = "/foo/{id}")] string GetFoo(int id); 我希望我的服务既可
您好,我有一个简单的 WCF REST 服务,我需要通过如下所示的查询字符串获取一些参数。 page=1&rp=10&sortname=id&sortorder=asc&query=&qtype=Ap
我是一名优秀的程序员,十分优秀!