2016-02-11 80 views
1

我嘗試直接從Web應用程序訪問Windows服務中承載的WCF服務時出現問題,我無法理解我在做什麼錯誤。在Windows服務中託管的WCF訪問

我嘗試所有建議,我發現並沒有任何幫助。我使用AngularJs,但這並不重要,我接受所有建議。

有我的項目:https://github.com/djromix/Portal.WorckFlow

Portal.Services是Windows服務。

這是我的windows服務配置:

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true" /> 
    <httpProtocol> 
     <customHeaders> 
     <add name="Access-Control-Allow-Origin" value="*" /> 
     <add name="Access-Control-Allow-Headers" value="Content-Type" /> 
     </customHeaders> 
    </httpProtocol> 
</system.webServer> 
<system.serviceModel> 
    <behaviors> 
      <serviceBehaviors> 
      <behavior name=""> 
       <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 
       <serviceDebug includeExceptionDetailInFaults="false" /> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <services> 
     <service name="Portal.Services.ServiceContract.PortalContract"> 
      <endpoint 
       address="" 
       binding="basicHttpBinding" 
       contract="Portal.Services.ServiceContract.IPortalContract"> 
       <identity> 
        <dns value="localhost" /> 
       </identity> 
      </endpoint> 
      <endpoint 
       address="mex" 
       binding="mexHttpBinding" 
       contract="IMetadataExchange" /> 
      <host> 
       <baseAddresses> 
        <add baseAddress="http://localhost:8000/Portal" /> 
       </baseAddresses> 
      </host> 
     </service> 
    </services> 
</system.serviceModel> 


服務代碼:

namespace Portal.Services.ServiceContract 
    { 
     // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IPortalContract" in both code and config file together. 
     [ServiceContract(Namespace = "")] 
     public interface IPortalContract 
     { 
      [WebInvoke(ResponseFormat = WebMessageFormat.Json, Method = "GET", BodyStyle = WebMessageBodyStyle.Wrapped)] 
      double Ping(); 

      [OperationContract] 
      object CashInResult(string key); 
     } 
    } 

namespace Portal.Services.ServiceContract 
{ 
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
    public class PortalContract : IPortalContract 
    { 
     public double Ping() 
     { 
      return -1; 
     } 

     [WebGet] 
     [WebInvoke(ResponseFormat = WebMessageFormat.Json, Method = "GET", BodyStyle = WebMessageBodyStyle.Wrapped)] 
     public object CashInResult(string key) 
     { 
      return new {Value = "Some Data"}; 
     } 
    } 
} 

我只想簡單訪問的URL,並獲得JSON結果
http://localhost:8000/Portal/CashInResult?key=secretkey

現在我得到的錯誤[Failed to load resource: the server responded with a status of 400 (Bad Request)]

從Web應用程序出現錯誤

XMLHttpRequest cannot load /Portal/CashInResult?key=1. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin '???' is therefore not allowed access. The response had HTTP status code 400. 
+0

你試過了什麼,結果是什麼?你能看到服務嗎?你有錯誤嗎? – Tim

+0

從瀏覽器時,訪問URL我得到異常[無法加載資源:服務器響應狀態400(壞請求] – user2156275

回答

1

爲了讓您的GET請求來工作,你可以添加標題(訪問控制允許來源)自己在瀏覽器中的請求,但只有GET請求才能工作。

如果您在Windows服務中運行WCF,那麼system.webServer沒有被使用,因爲沒有IIS。

此鏈接顯示如何在WCF完全CORS實現IIS以外..

https://code.msdn.microsoft.com/windowsdesktop/Implementing-CORS-support-c1f9cd4b

但它有點長在SO後解釋,但是這就是爲什麼它不適合你的工作瞬間......

在CORS世界中有兩種類型的請求,「正常」請求和「預檢」請求。

正常的或安全的(HTTP GET)請求涉及瀏覽器發送ORIGIN頭與請求,服務器接受/拒絕基於此。

預檢或不安全(如POST,PUT或DELETE)請求涉及瀏覽器發送HTTP OPTIONS請求,要求將實際請求發送到服務器的權限。

當您啓用system.webServer部分中的設置時,IIS會爲您查找所有這些信息。將WCF作爲Windows服務託管服務將IIS取出,因此在WCF中,您需要自己實施CORS服務。

我認爲你應該重新考慮一下,如果服務的目的是服務於HTTP請求,那就使用IIS。

+0

我的任務聽起來像這樣,我有Web應用程序,通過這個Web應用程序,我需要在沒有訪問服務器的情況下訪問客戶端上的本地設備,我們將有一些門戶網站在客戶端支付帳單,我知道這對於城域應用程序或Windows應用程序來說更容易。這種情況下,服務器需要知道計算機我只是得到客戶端IP,並更改端點地址,它的工作很好,但我們需要忽略呼叫通過服務器。 – user2156275

0

經過多次嘗試,我找到了解決方案。 從瀏覽器210


 namespace Portal.Services.ServiceContract 
{ 
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IPortalContract" in both code and config file together. 
    [ServiceContract(Namespace = "")] 
    public interface IPortalContract 
    { 
     [WebInvoke(ResponseFormat = WebMessageFormat.Json, Method = "GET", BodyStyle = WebMessageBodyStyle.Wrapped)] 
     double Ping(); 

     [OperationContract] 
     string CashInResult(string key); 
    } 
} 


namespace Portal.Services.ServiceContract 
     { 
      [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
      public class PortalContract : IPortalContract 
      { 
       readonly Logger _nLog = LogManager.GetCurrentClassLogger(); 
       public double Ping() 
       { 
        using (var tMeter = new TimeMeterLog(_nLog, "Ping")) 
        { 
         tMeter.Info("-1"); 
         return -1; 
        } 
       } 

       [WebGet(UriTemplate = "/CashInResult/{key}", ResponseFormat = WebMessageFormat.Json)] 
       public string CashInResult(string key) 
       { 
        using (var tMeter = new TimeMeterLog(_nLog, "CashInResult")) 
        { 
         var result = JsonConvert.SerializeObject(new { Value = "Some Data" }); 
         tMeter.Info(result); 
         return result; 
        } 
       } 
      } 
     } 


呼叫服務:

http://localhost:8000/rest/Ping 


結果:{"PingResult":-1}

有源代碼。 https://github.com/djromix/Portal.WorckFlow

相關問題