0

WebServiceHost를 통해 호스팅되는 서비스가 있으며 웹의 다른 REST 서비스에 대한 호출을 위임해야합니다.ServiceContract OperationContract를 실행하는 동안 ChannelFactory가 항상 WebHttpBinding을 사용하여 POST됩니다.

이 문제를 처리하기 위해 ClientBase concrete 클래스를 만들었습니다. 흐름은 다음과 같습니다

http://localhost:8000/users/[email protected] -> 내 WebServiceHost 예 -> ClientBase -> REST 서비스 나 ClientBase에서 오는 모든 통화가 동사로 POST를 사용하고 있음을 깨달았 때까지

모든 것이 잘 작동했다. ClientBase로 어리석은 일을하지 않기 위해서 나는 수동으로 ChannelFactory를 만들고 그것을 사용했습니다. ClientBase, ChannelFactory 및 심지어 ServiceContract 장식에 관계없이 모든 호출에서 POST를 사용했습니다.

그런 다음 코드 분리를 시작하고 WebServiceHost가 처리 한 요청 내에서 원래 호출이 오지 않을 때 간단한 ChannelFactory가 작동 함을 알게되었습니다. 여기

정확한 문제 Program.Main에서 MakeGetCall()를 전시 증류 Program.cs를 의도하지만 MyService.GetUser에서 호출이 항상 POST는 것으로 작동합니다

class Program 
{ 
    static void Main(string[] args) 
    { 
     //Program.MakeGetCall(); //This works as intended even when changing the WebInvoke attribute parameters 

     WebServiceHost webServiceHost = new WebServiceHost(typeof(MyService), new Uri("http://localhost:8000/")); 

     ServiceEndpoint serviceEndpoint = webServiceHost.AddServiceEndpoint(typeof(IMyServiceContract), new WebHttpBinding(), ""); 

     webServiceHost.Open(); 

     Console.ReadLine(); 
    } 

    public static void MakeGetCall() 
    { 
     ServiceEndpoint endpoint = new ServiceEndpoint(
      ContractDescription.GetContract(typeof(IMyServiceContract)), 
      new WebHttpBinding(), 
      new EndpointAddress("http://posttestserver.com/post.php")); 

     endpoint.Behaviors.Add(new WebHttpBehavior()); 

     ChannelFactory<IMyServiceContract> cf = new ChannelFactory<IMyServiceContract>(endpoint); 

     IMyServiceContract test = cf.CreateChannel(); 

     test.GetUser("test"); 
    } 

} 

[ServiceContract] 
public interface IMyServiceContract 
{ 
    [OperationContract] 
    [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, 
     UriTemplate = "https://stackoverflow.com/users/{emailAddress}")] 
    string GetUser(string emailAddress); 
} 

public class MyService : IMyServiceContract 
{ 
    public string GetUser(string emailAddress) 
    { 
     Program.MakeGetCall(); //This will ALWAYS POST no matter if you are using [WebInvoke(Method="GET")] or even [WebGet] 

     return "foo"; 
    } 
} 

답변