2013-07-11 156 views
0

我目前正在使用使用寧靜服務的應用程序。還有另一個應用程序正在運行自行託管的WCF服務。我想從寧靜的服務中消費自己託管的服務,但我遇到了一個問題。我得到(405)方法不允許。Restful服務使用WCF自我託管服務

下面是如何自我託管服務創建和託管

ServiceHost host = new ServiceHost(typeof(LiveService)); 
host.Open(); 

這裏是我正在試圖消耗功能的RESTful服務

BinaryMessageEncodingBindingElement binaryMessageEncoding = new BinaryMessageEncodingBindingElement(); 
HttpTransportBindingElement httpTransport = new HttpTransportBindingElement() { MaxBufferSize = int.MaxValue, MaxReceivedMessageSize = int.MaxValue }; 
CustomBinding ServiceCustomBinding = new CustomBinding(binaryMessageEncoding, httpTransport); 

EndpointAddress ServiceEndpointAddress = new EndpointAddress(string.Format("http://{0}/LiveService", host)); 

LiveWebServiceClient client = new LiveWebServiceClient(ServiceCustomBinding, ServiceEndpointAddress); 

這裏是服務的例子

[ServiceContract] 
public interface ILiveService 
{ 
    [OperationContract] 
    string Hello(); 
} 

public string Hello() 
{ 
    return "Hello"; 
} 

我做了一些研究,我猜它是因爲我從ar打電話美好的服務。我嘗試過使用[WebGet()]和[WebInvoke(Method =「GET」)],但它似乎沒有什麼區別。不知道我錯過了什麼。

+0

什麼是您的主機值在string.Format(「http:// {0}/LiveService」,主機)設置爲? –

+0

我正在傳遞值。這最終成爲問題,我沒有包括自我託管服務的端口。 – thecaptain0220

回答

1

我試圖模仿你的方案(從什麼我可以從描述理解),它工作得很好 -

自託管服務代碼RESTful服務調用自託管服務後

namespace SelfHostedService 
    { 
    [ServiceContract] 
    internal interface ILiveService 
    { 
     [OperationContract] 
     string Hello(); 
    } 

public class LiveService:ILiveService 
{ 
    public string Hello() 
    { 
     return "Hello"; 
    } 
} 
} 
     static void Main(string[] args) 
    { 
     var binaryMessageEncoding = new TextMessageEncodingBindingElement(); 
     var httpTransport = new HttpTransportBindingElement() { MaxBufferSize = int.MaxValue, MaxReceivedMessageSize = int.MaxValue }; 
     var ServiceCustomBinding = new CustomBinding(binaryMessageEncoding, httpTransport); 

     ServiceHost host = new ServiceHost(typeof(LiveService), new Uri("http://localhost:3239/LiveService")); 
     host.AddServiceEndpoint(typeof (ILiveService), ServiceCustomBinding, ""); 
     var smb = new ServiceMetadataBehavior(); 
     smb.HttpGetEnabled = true; 
     host.Description.Behaviors.Add(smb); 
     host.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpBinding(), "mex"); 

     host.Open(); 
     Console.ReadLine(); 
    } 

加上參考自託管服務 -

[ServiceContract] 
public interface IService1 
{ 

    [OperationContract] 
    [WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)] 
    } 

    public string ReturnFromSelfHostService() 
    { 
     var binaryMessageEncoding = new TextMessageEncodingBindingElement(); 
     var httpTransport = new HttpTransportBindingElement() { MaxBufferSize = int.MaxValue, MaxReceivedMessageSize = int.MaxValue }; 
     var ServiceCustomBinding = new CustomBinding(binaryMessageEncoding, httpTransport); 
     var ServiceEndpointAddress = new EndpointAddress(string.Format("http://{0}/LiveService", "localhost:3239")); 

     var client = new LiveServiceClient(ServiceCustomBinding, ServiceEndpointAddress); 
     return client.Hello(); 

    } 
    string ReturnFromSelfHostService(); 

} 

它返回我

<ReturnFromSelfHostServiceResponse xmlns="http://tempuri.org/"> 
    <ReturnFromSelfHostServiceResult>Hello</ReturnFromSelfHostServiceResult> 
    </ReturnFromSelfHostServiceResponse> 
+0

當然,您可以在自定義綁定中使用BinaryEncoding。 – vibhu

+0

謝謝你的時間嘗試一下。看看你的代碼,它在面對我時做錯了什麼。我忘了將端口添加到地址中。我使用相同的代碼連接到不需要端口的託管服務,並忘記將其添加到自託管服務中。我被錯誤分心了。這似乎是一個奇怪的錯誤。它似乎沒有找到服務。再次感謝您的時間和幫助。 – thecaptain0220