WebChannelFactory를 사용하여 WCF를 사용하여 다양한 기술로 구현 된 제어 할 수없는 일부 서비스를 호출합니다. WCF 관점에서 내 인터페이스에는 하나의 메서드 만 있습니다. "get-stuff"라고 부르겠습니다. 따라서 이러한 서비스에서는 http://www.service-a.com/get-stuff 또는 http://www.service-b.com/my-goodies/ 또는 http 와 같은 방법을 구현할 수 있습니다. : //www.service-c.com/retrieve-thing.php
모든 예제에서 특정 URI에 대한 메서드 바인딩이 WebGet / WebInvoke 특성의 UriTemplate 멤버를 통해 수행되는 것을 보았습니다. 그러나 이것은 "get-stuff"메소드의 모든 URI가 고정 된 템플릿을 따라야 함을 의미합니다. 예를 들어, UriTemplate = "/ get-stuff"를 만들 수 있으므로 메서드는 항상 / get-stuff에 바인딩됩니다.
그러나 내 메서드가 임의의 URI에 바인딩되기를 원합니다. BTW, 매개 변수는 POST 데이터로 전달되므로 URI를 메서드의 매개 변수에 바인딩하는 것에 대해 걱정할 필요가 없습니다.
좋습니다. 런타임에 WebInvokeAttribute의 UriTemplate을 패치하여 문제에 대한 해결책을 찾았습니다. 내 단일 방법 WCF 인터페이스는 다음과 같습니다.
[ServiceContract]
interface IGetStuff
{
[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
ResponseData GetStuff(RequestData request);
}
인터페이스에 대한 핸들을 얻는 방법은 다음과 같습니다.
//Find the last portion of the URI path
var afterLastPathSepPos = uri.LastIndexOf('/', uri.Length - 2) + 1;
var contractDesc = ContractDescription.GetContract(typeof(IGetStuff));
foreach (var b in contractDesc.Operations[0].Behaviors)
{
var webInvokeAttr = b as WebInvokeAttribute;
if (webInvokeAttr != null)
{
//Patch the URI template to use the last portion of the path
webInvokeAttr.UriTemplate = uri.Substring(afterLastPathSepPos, uri.Length - afterLastPathSepPos);
break;
}
}
var endPoint = new ServiceEndpoint(contractDesc, new WebHttpBinding(), new EndpointAddress(uri.Substring(0, afterLastPathSepPos)));
using (var wcf = new WebChannelFactory<I>(endPoint))
{
var intf = wcf.CreateChannel();
var result = intf.GetStuff(new RequestData(/*Fill the request data here*/)); //Voila!
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다