我正在使用一个使用wcf和sharp架构的应用程序,我正在尝试创建一个写入数据库的服务。这是我的服务:
[ServiceContract]
public interface IFacilitiesWcfService : ICloseableAndAbortable
{
[OperationContract]
void AddFacility(string facility);
}
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
class FacilitiesWcfService:IFacilitiesWcfService
{
public FacilitiesWcfService(IRepositoryWithTypedId<Facility,string> facilityRepository)
{
Check.Require(facilityRepository != null, "facilityRepository may not be null");
this.facilityRepository = facilityRepository;
}
private readonly IRepositoryWithTypedId<Facility,string> facilityRepository;
public void AddFacility(string facility)
{
facilityRepository.DbContext.BeginTransaction();
Facility newFacility = new Facility();
newFacility.SetAssignedIdTo(facility);
newFacility.NAME=facility;
newFacility.ADDRESS = facility;
facilityRepository.DbContext.CommitTransaction();
}
public void Abort() { }
public void Close() { }
}
Web项目中的LogisticsWCF.svc文件:
<%@ ServiceHost Language="C#" Debug="true" Service="Project.Wcf.FacilitiesWcfService"
Factory="SharpArch.Wcf.NHibernate.ServiceHostFactory, SharpArch.Wcf" %>
我创建了一个svcutil.exe http://localhost:1905/LogisticsWCF.svc?wsdl
的客户端,然后创建了这个测试用例:
[TestFixture]
class WCFLogisticsTests
{
[Test]
public void CanAddFacility()
{
FacilitiesWcfServiceClient facility = new FacilitiesWcfServiceClient();
facility.AddFacility("NEW");
facility.Close();
}
}
但我得到了这个例外:
TestCase 'Tests.Project.Web.WCFLogisticsTests.CanAddFacility'
failed: System.ServiceModel.FaultException`1[System.ServiceModel.ExceptionDetail] : The needed dependency of type FacilitiesWcfService could not be located with the ServiceLocator. You'll need to register it with the Common Service Locator (CSL) via your IoC's CSL adapter.
Server stack trace:
at System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(Message reply, MessageFault fault, String action, MessageVersion version, FaultConverter faultConverter)
at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs)
at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at IFacilitiesWcfService.AddFacility(String facility)
C:\Documents and Settings\epena\My Documents\SVN\Project\tests\Project.Tests\FacilitiesWcfService.cs(58,0): at FacilitiesWcfServiceClient.AddFacility(String facility)
WCFLogisticsTests.cs(18,0): at Tests.Project.Web.WCFLogisticsTests.CanAddFacility()
0 passed, 1 failed, 0 skipped, took 4.52 seconds (NUnit 2.5.2).
我认为我缺少一些尖锐架构的配置,因为当我在.svc文件中不使用Factory="SharpArch.Wcf.NHibernate.ServiceHostFactory, SharpArch.Wcf"
时,我没有得到异常,但是我无法写任何内容数据库(我得到一个ISession未配置的异常)。
我试图按照Northwind的例子,但它不起作用,我可以丢失什么?
答案 0 :(得分:3)
最后我找到了答案,我在ComponentRegistrar中遗漏了以下一行:
container.AddComponent("facilityWcfService", typeof(FacilitiesWcfService));
答案 1 :(得分:1)
您没有从服务方法返回任何内容,因此需要将其标记为IsOneWay = true:
[ServiceContract]
public interface IFacilitiesWcfService : ICloseableAndAbortable
{
[OperationContract(IsOneWay=true)]
void AddFacility(string facility);
}
默认情况下,WCF需要请求/响应,即它希望从服务方法获得响应。 “void”不算作回应 - 所以只需标记那些不返回IsOneWay=true
任何内容的服务方法,你应该没问题。