我整天都在搜索和浪费了我能想到或找到解决这个问题的一切:我构建了我的第一个WCF服务,并认为在IIS中托管它会很酷。这是一个长期运行的服务,所以这是一个禁忌。我已经在我的解决方案中添加了另一个项目来托管WCF服务,引用了WCF项目,并且在尝试从代码托管时遇到了不断的困难。 我主要关注http://msdn.microsoft.com/en-us/library/ms733069.aspx以获得有关实施主机的指导,并针对我的具体情况进行了微调。
当前的挑战是简单地获取托管项目的App.config中定义的服务端点。它无法将“端点”的“合同”属性解析为我的WCF服务合同。
WCF大会
namespace WcfFoldingService
{
[ServiceContract(SessionMode=SessionMode.Required, CallbackContract=typeof(IFoldingUpdaterClientContract))]
public interface IFoldingUpdaterServiceBehavior
{
[OperationContract(IsOneWay = false, IsInitiating = true)]
void Subscribe();
[OperationContract(IsOneWay = false, IsTerminating = true)]
void Unsubscribe();
[OperationContract(IsOneWay = true)]
void PublishSomeOperation();
}
public interface IFoldingUpdaterClientContract
{
[OperationContract(IsOneWay = true)]
void SomeOperation();
}
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession, ConcurrencyMode=ConcurrencyMode.Single)]
public class FoldingUpdaterService : IFoldingUpdaterServiceBehavior
{
// Omitted for brevity, but complete implementation exists.
}
}
/ WCF大会
主持大会
App.config
<system.serviceModel>
<services>
<service name="WcfFoldingService.FoldingUpdaterService" behaviorConfiguration="httpServiceBehavior">
<endpoint address="" binding="wsDualHttpBinding" bindingConfiguration="ServiceBindingConfiguration" contract="WcfFoldingService.IFoldingUpdaterServiceBehavior"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<protocolMapping>
<add scheme="http" binding="wsDualHttpBinding" bindingConfiguration="ServiceBindingConfiguration"/>
</protocolMapping>
<bindings>
<wsDualHttpBinding>
<binding name="ServiceBindingConfiguration">
<reliableSession ordered="true"/>
<security mode="None"/>
</binding>
</wsDualHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="httpServiceBehavior">
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False"/>
<serviceThrottling maxConcurrentCalls="1000" maxConcurrentInstances="100" maxConcurrentSessions="100"/>
<sendMessageChannelCache allowUnsafeCaching="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
/主持大会
Message:
The 'contract' attribute is invalid - The value 'WcfFoldingService.IFoldingUpdaterServiceBehavior' is invalid according to its datatype 'serviceContractType' - The Enumeration constraint failed.
我很难过。 Google提供的链接很少,而且它们主要与我没有遇到的其他配置问题有关。引用了WCF程序集,我使用的是完全限定名称,我甚至尝试使用ConfigurationName属性,以防某些命名空间发生冲突。我是WCF的新手,所以我希望这是一个明显的问题!
编辑:
我现在使用的是编程配置而不是App.config XML。最重要的语句是ContractDescription.GetContract(serviceType)
,因为偶数new ContractDescription("FullNamespace.IContract")
与XML配置完全失败。 serviceType的FullName属性的Type对象与我的“FullNamespace.IContract”完全相同。我怀疑在没有代码中没有硬引用的情况下没有加载程序集的问题,但我现在还不能确定。目前,这种方法可以正常工作:
using (var host = new ServiceHost(typeof(FoldingUpdaterService), baseAddress))
{
var serviceType = typeof (IFoldingUpdaterServiceBehavior);
var serviceContract = ContractDescription.GetContract(serviceType);
var foldingEndpoint = new ServiceEndpoint(serviceContract)
{
Binding = new WSDualHttpBinding()
Address = new EndpointAddress(new Properties.Settings().WcfUpdaterServiceAddress)
};
host.Description.Endpoints.Add(foldingEndpoint);
[...]
答案 0 :(得分:3)
这是一个老问题,但万一有人遇到同样的问题,这对我有用: 尝试关闭Visual Studio并删除与解决方案文件(.sln)位于同一目录的.suo文件。这会重置编辑器缓存。我将服务合同文件移动到另一个程序集后,我遇到了同样的问题,缓存仍然引用了旧位置。
答案 1 :(得分:1)
自托管应用程序需要<host>
标记内的<service>
标记:
<system.serviceModel>
<services>
<service name="WcfFoldingService.FoldingUpdaterService" behaviorConfiguration="httpServiceBehavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8080/Services/"/>
</baseAddresses>
</host>
<endpoint address="" binding="wsDualHttpBinding" bindingConfiguration="ServiceBindingConfiguration" contract="WcfFoldingService.IFoldingUpdaterServiceBehavior"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
答案 2 :(得分:0)
我不知道这对你来说是否还是个问题,但最近偶然发现了同样的问题,这可能会有所帮助。
指定服务名称时,您还必须使用命名空间。因此,假设您的命名空间为myhost
,那么正确的条目将是......
<service name="myhost.WcfFoldingService.FoldingUpdaterService"...>
这同样适用于合同。
答案 3 :(得分:0)
我的解决方案是使用VS2012创建的,包含多个.NET 4.0项目。我切换到VS2013,当我添加一个新的WCF库项目时,它是用.NET 4.5创建的。将新项目重置为.NET 4.0解决了我的问题。
答案 4 :(得分:-1)
确保您在主机
中引用了服务应用程序