WCF REST 스타터 키트 - 'uritemplatematchResults'라는 이름의 속성이 이미 존재합니다.

StackOverflow https://stackoverflow.com/questions/379162

  •  22-08-2019
  •  | 
  •  

문제

방금 WCF REST 스타터 키트로 시작했습니다.

객체 배열을 반환하는 간단한 서비스를 만들었습니다.

브라우저를 사용하면 모든 것이 잘 작동하지만 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);
            }

서버와 클라이언트는 동일한 솔루션에 있으며 서비스 계약을 설명하기 위해 동일한 인터페이스를 사용하고 있습니다.

예외는 다음과 같이 말합니다. 그리고 그것은 스택 추적입니다.

수업을 예외적으로 발사합니다 -> 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;

고맙습니다!

안드레 카를루치

도움이 되었습니까?

해결책

같은 문제가 있었고 도움말 페이지를 비활성화하고 수정했습니다. 일부 REST URL이 매우 빠르게 순서로 호출되면 예외가 발생했습니다. 전화를 기다릴 때 괜찮 았습니다.

protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
        {
            return new WebServiceHost2(serviceType, true, baseAddresses) {EnableAutomaticHelpPage = false};
        }

다른 팁

나는 같은 프로브를 가지고 있었지만 도움말 페이지를보고 싶었으므로 비활성화하는 것은 나에게 해결책이 아니 었습니다. WCF REST 툴킷에서 UritemPlating이 템플릿 테이블에 이미이 템플릿이 있다는 것을 알 때 이러한 문제를 일으킨다는 것을 알았습니다. 기본적으로 메소드의 URL이 요청 된 데이터에 따라 다를 때만 템플릿이 필요합니다. 결국 템플릿이 원하는 것입니다. 게시물 작업에 대해 동일한 uritemplates가 있었으므로 URL은 별도의 쿼리간에 다르지 않아이 오류가 발생했습니다. 그런 다음 적어도 게시물 작업에 대해 전혀 템플릿이 필요하지 않다는 것을 알았습니다. 또한 Youvannot은 매개 변수로 복잡한 객체를 전달 해야하는 경우 URL을 게시하지만 게시물 쿼리를 만듭니다. 그래서 서비스 인터페이스의 webinvoke 속성에서 매개 변수라는 uritemplate을 제거했습니다. 문제가 해결되었다고 생각합니다. 물론 서버에 쿼리를 얻고 uritemplating에 의존하면 도움이되거나 도움말 페이지를 남겨 두어야합니다.

필자의 경우 Visual Studio Debugger 통합이 활성화 된 WCF 채널을 사용하여 엔드 포인트에 액세스 할 때만 문제가 발생했습니다.

ChanneFlactory에서 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 Debugger 통합을 비활성화하는 다른 방법이 있지만 시스템 전체에있는 것처럼 보이지만이 솔루션은 로컬입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top