C# WCF REST初学者工具包-名称为';UriTemplateMatchResults';已经存在
我刚开始使用WCF REST初学者工具包 我创建了一个简单的服务,它返回一个对象数组 使用浏览器,一切正常,但当我使用WCF客户端时,会出现异常 我没有使用IIS,代码如下: 合同:C# WCF REST初学者工具包-名称为';UriTemplateMatchResults';已经存在,c#,wcf,rest,wcf-client,C#,Wcf,Rest,Wcf Client,我刚开始使用WCF REST初学者工具包 我创建了一个简单的服务,它返回一个对象数组 使用浏览器,一切正常,但当我使用WCF客户端时,会出现异常 我没有使用IIS,代码如下: 合同: [ServiceContract] public interface IGiftService { [WebGet(UriTemplate="gifts")] [OperationContract] List<Gift> GetGifts();
[ServiceContract]
public interface IGiftService {
[WebGet(UriTemplate="gifts")]
[OperationContract]
List<Gift> GetGifts();
}
public class GiftService : IGiftService {
public List<Gift> GetGifts() {
return new List<Gift>() {
new Gift() { Name = "1", Price = 1.0 },
new Gift() { Name = "2", Price = 1.0 },
new Gift() { Name = "3", Price = 1.0 }
};
}
}
[DataContract]
public class Gift {
[DataMember]
public string Name { get; set; }
[DataMember]
public double Price { get; set; }
}
WebServiceHost2 host = new WebServiceHost2(
typeof(GiftService),
true,
new Uri("http://localhost:8099/tserverservice"));
host.Open();
Console.WriteLine("Running");
Console.ReadLine();
host.Close();
WebChannelFactory<IGiftService> factory = new WebChannelFactory<IGiftService>(
new Uri("http://localhost:8099/tserverservice"));
IGiftService service = factory.CreateChannel();
List<Gift> list = service.GetGifts();
Console.WriteLine("-> " + list.Count);
foreach (var item in list) {
Console.WriteLine("-> " + item.Name);
}
at System.ServiceModel.Channels.MessageProperties.UpdateProperty(String name, Object value, Boolean mustNotExist)
at System.ServiceModel.Channels.MessageProperties.Add(String name, Object property)
at System.ServiceModel.Dispatcher.WebHttpDispatchOperationSelector.SelectOperation(Message& message, Boolean& uriMatched)
at System.ServiceModel.Dispatcher.WebHttpDispatchOperationSelector.SelectOperation(Message& message)
at Microsoft.ServiceModel.Web.WrappedOperationSelector.SelectOperation(Message& message) in C:\Program Files\WCF REST Starter Kit\Microsoft.ServiceModel.Web\WrappedOperationSelector.cs:line 42
at Microsoft.VisualStudio.Diagnostics.ServiceModelSink.ServiceMethodResolver.GetOperation()
at Microsoft.VisualStudio.Diagnostics.ServiceModelSink.ServiceMethodResolver..ctor(ContractDescription contract, DispatchRuntime runtime, Message request, InstanceContext instanceContext)
启动客户端:
[ServiceContract]
public interface IGiftService {
[WebGet(UriTemplate="gifts")]
[OperationContract]
List<Gift> GetGifts();
}
public class GiftService : IGiftService {
public List<Gift> GetGifts() {
return new List<Gift>() {
new Gift() { Name = "1", Price = 1.0 },
new Gift() { Name = "2", Price = 1.0 },
new Gift() { Name = "3", Price = 1.0 }
};
}
}
[DataContract]
public class Gift {
[DataMember]
public string Name { get; set; }
[DataMember]
public double Price { get; set; }
}
WebServiceHost2 host = new WebServiceHost2(
typeof(GiftService),
true,
new Uri("http://localhost:8099/tserverservice"));
host.Open();
Console.WriteLine("Running");
Console.ReadLine();
host.Close();
WebChannelFactory<IGiftService> factory = new WebChannelFactory<IGiftService>(
new Uri("http://localhost:8099/tserverservice"));
IGiftService service = factory.CreateChannel();
List<Gift> list = service.GetGifts();
Console.WriteLine("-> " + list.Count);
foreach (var item in list) {
Console.WriteLine("-> " + item.Name);
}
at System.ServiceModel.Channels.MessageProperties.UpdateProperty(String name, Object value, Boolean mustNotExist)
at System.ServiceModel.Channels.MessageProperties.Add(String name, Object property)
at System.ServiceModel.Dispatcher.WebHttpDispatchOperationSelector.SelectOperation(Message& message, Boolean& uriMatched)
at System.ServiceModel.Dispatcher.WebHttpDispatchOperationSelector.SelectOperation(Message& message)
at Microsoft.ServiceModel.Web.WrappedOperationSelector.SelectOperation(Message& message) in C:\Program Files\WCF REST Starter Kit\Microsoft.ServiceModel.Web\WrappedOperationSelector.cs:line 42
at Microsoft.VisualStudio.Diagnostics.ServiceModelSink.ServiceMethodResolver.GetOperation()
at Microsoft.VisualStudio.Diagnostics.ServiceModelSink.ServiceMethodResolver..ctor(ContractDescription contract, DispatchRuntime runtime, Message request, InstanceContext instanceContext)
我做错了什么
更新:我禁用了“帮助”页面,服务正在运行。是虫子吗
host.EnableAutomaticHelpPage = false;
谢谢大家!
安德烈·卡鲁奇(AndréCarlucci)也有同样的问题,他禁用了帮助页面,并修复了它。如果某些REST URL以很快的顺序被调用,则会引发异常。在两次通话之间等待时,一切都很好
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
return new WebServiceHost2(serviceType, true, baseAddresses) {EnableAutomaticHelpPage = false};
}
我也有同样的问题,但我想看到帮助页面,所以禁用它对我来说不是一个解决方案。我发现WCFRestToolkit中的URITemplating导致了这些问题,当它看到模板表中已经有这个模板时。基本上,只有当方法的URL根据请求的数据不同时,您才需要一个模板,毕竟,这就是模板的用途。我的POST操作使用相同的URI模板,因此导致此错误的不同查询之间的URL没有差异。然后我发现我实际上根本不需要任何模板,至少在POST操作中是这样,而且如果你的方法需要一个复杂的对象作为参数传递,你也不需要通过URL进行POST查询。因此,我从服务接口的WebInvoke属性中删除了名为parameter的URITemplate,我认为这解决了问题。当然,如果您对服务器进行GET查询并依赖于URITemplating,那么您仍然必须忍受或放弃帮助页。在我的情况下,仅当使用启用Visual Studio调试器集成的WCF通道访问端点时才会出现问题 我通过添加一些代码从ChannelFactory中删除VS行为来解决这个问题:
var vsBehaviour = channelFactory.Endpoint.EndpointBehaviors
.FirstOrDefault(i =>
i.GetType().Namespace == "Microsoft.VisualStudio.Diagnostics.ServiceModelSink");
if (vsBehaviour != null)
{
channelFactory.Endpoint.Behaviors.Remove(vsBehaviour);
}
显然,还有其他方法可以禁用WCF Visual Studio调试器集成,但它们似乎是系统范围的,而此解决方案是本地的。如果REST starter工具包的功能为您提供了所需的功能,请继续。如果你想学习如何休息,那就远离它。回归到标准RPC样式太容易了。