3

我刚开始使用 WCF REST Starter Kit。

我创建了一个返回对象数组的简单服务。

使用浏览器,一切正常,但是当我使用 WCF 客户端时,我得到一个 ArgumentException。

我没有使用 IIS,代码如下:

合同:

[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);
            }

服务器和客户端在同一个解决方案中,我在两者中使用相同的接口(描述服务合同)。

异常显示:“名称为 'UriTemplateMatchResults' 的属性已存在。” 这就是堆栈跟踪:

触发异常的类-> Microsoft.ServiceModel.Web.WrappedOperationSelector

堆栈跟踪:

  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;

谢谢!

安德烈·卡鲁奇

4

3 回答 3

1

有同样的问题,禁用帮助页面并修复它。如果一些 REST url 被快速按顺序调用,则会引发异常。在通话之间等待时很好。

protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
        {
            return new WebServiceHost2(serviceType, true, baseAddresses) {EnableAutomaticHelpPage = false};
        }
于 2009-02-02T11:30:52.977 回答
1

我有同样的问题,但我想查看帮助页面,所以禁用它对我来说不是解决方案。我发现 WCF REST 工具包中的 URITemplating 导致了这些问题,当它看到模板表中已经有这个模板时。基本上,当您的方法的 URL 根据请求的数据而不同时,您只需要一个模板,毕竟,这就是模板的用途。我的 POST 操作具有相同的 URITemplates,因此导致此错误的单独查询之间的 URL 没有区别。然后我发现我实际上根本不需要任何模板,至少对于 POST 操作,此外,如果您的方法需要将复杂对象作为参数传递,则您不需要通过 URL 进行 POST 查询。所以我从服务接口的 WebInvoke 属性中删除了 URITemplate 命名参数,我认为这解决了问题。当然,如果您对服务器进行 GET 查询并依赖 URITemplating,您仍然必须忍受或放弃帮助页面。

于 2010-05-14T13:54:19.223 回答
1

就我而言,问题仅在使用启用了 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 调试器集成,但它们似乎是系统范围的,而此解决方案是本地的。

于 2017-12-21T18:38:35.270 回答