我正在尝试在没有 svc 文件的情况下在我的 wcf Web 服务中使用 unity.wcf。
我的代码:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Single)]
//[BasicAuthentication] TODO: this need to be set up
public class SsoAuthenticationService : ISsoAuthenticationService
{
private readonly ICustomerManager _manager;
internal const string ServiceUri = "SsoAuthenticationService";
public SsoAuthenticationService(ICustomerManager manager)
{
_manager = manager;
}
[WebGet(UriTemplate = "CreateSsoLogin/{request}")]
public ServiceResponse<bool> CreateSsoLogin(string request)
{
// TODO: inputs and outputs are wrong
_manager.DoWork();
return new ServiceResponse<bool>();
}
}
public class ServiceFactory : UnityServiceHostFactory
{
protected override void ConfigureContainer(Microsoft.Practices.Unity.IUnityContainer container)
{
container.RegisterType<ISsoAuthenticationService, SsoAuthenticationService>("authentication")
.RegisterType<ICustomerManager, CustomerManager>();
}
}
现在,当我尝试连接 ServiceFactory 类时,问题就出现了——在我看到的所有代码示例中,它们都是通过 svc 文件执行此操作的,但我的应用程序中没有,因为它使用的是 ASP.NET 路由。
所以我的 Global.asax 看起来像:
private static void RegisterRoutes(RouteCollection routes)
{
//Integrate WCF services with the ASP.NET routing feature
routes.Add(new ServiceRoute(SsoAuthenticationService.ServiceUri, new ServiceFactory(), typeof(SsoAuthenticationService)));
}
当我调用我的 Web 服务方法时,我没有点击 Web 方法代码(尽管它确实调用了 ServiceFactory.ConfigureContainer)。如果我不使用 Unity,Global.asax 将如下所示:
private static void RegisterRoutes(RouteCollection routes)
{
//Integrate WCF services with the ASP.NET routing feature
routes.Add(new ServiceRoute(SsoAuthenticationService.ServiceUri, new WebServiceHostFactory(), typeof(SsoAuthenticationService)));
}
如果我把它改成这个,那么 web 方法就会被命中,但它当然会抱怨构造函数。
我需要什么额外的配置才能使 ServiceFactory 类表现得像 WebServiceHostFactory?
或者更好的选择是不使用 Unity.Wcf,并尝试使用普通的 Unity 来实现?