2011-05-11 186 views
2

我的應用程序由一個包含silverlight控件的MVC3網站組成。 在MVC3應用程序中,我承載了一個WCF服務。我在Silverlight控件中使用該服務從數據庫獲取數據。從silverlight訪問WCF服務

在MVC web.config中的服務被定義爲:

<system.serviceModel> 
<behaviors> 
    <endpointBehaviors> 
    <behavior name="OnlineCustomersTracker.Services.CustomersTrackerServiceAspNetAjaxBehavior"> 
     <enableWebScript /> 
    </behavior> 
    </endpointBehaviors> 
    <serviceBehaviors> 
    <behavior name=""> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="false" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" 
    multipleSiteBindingsEnabled="true" /> 
<services> 
    <service name="OnlineCustomersTracker.Services.CustomersTrackerService"> 
    <endpoint address="" behaviorConfiguration="OnlineCustomersTracker.Services.CustomersTrackerServiceAspNetAjaxBehavior" 
     binding="webHttpBinding" contract="OnlineCustomersTracker.Services.CustomersTrackerService" /> 
    </service> 
</services> 

我打電話的方法是:

[OperationContract] 
[WebGet(ResponseFormat = WebMessageFormat.Xml)] 
public string DoWork() 
{ 
    // Add your operation implementation here 
    return "Work done"; 
} 

在Silverlight我調用服務:

CustomersTrackerServiceClient client = new CustomersTrackerServiceClient(new BasicHttpBinding(), 
                       new EndpointAddress(
                        "http://localhost:62535/Services/CustomersTrackerService.svc")); 
     client.DoWorkCompleted += new System.EventHandler<DoWorkCompletedEventArgs>(client_DoWorkCompleted); 
     client.DoWorkAsync(); 

當我從silverlight訪問服務我得到異常:遠程服務器返回一個錯誤:NotFound。

奇怪的部分是該服務正在從Web瀏覽器工作。我在Silverlight中做錯了 ?

application request

我從Firefox跟蹤的呼叫和Silverlight控件是做一篇文章到服務地址:http://localhost:62535/Services/CustomersTrackerService.svc。看來我的服務只聽取獲取請求。有沒有辦法允許發佈請求...或者在Silverlight中配置服務來獲取請求?

+0

您是否嘗試添加跨域和客戶端訪問策略文件?這有什麼區別嗎? –

回答

1

這個一般錯誤並不是很有幫助。一般來說,通過啓用日誌記錄功能可能會帶來更多的運氣,因爲這通常會提供更多關於發生錯誤的指示,因爲在許多情況下會出現此錯誤。

啓用日誌記錄,你可以將它添加到配置文件服務:

<configuration> 
.... 
<system.diagnostics> 
<trace autoflush="true" /> 
<sources> 
    <source name="System.ServiceModel" switchValue="Verbose"> 
    <listeners> 
     <add name="sdt" type="System.Diagnostics.XmlWriterTraceListener" initializeData="D:\path\to\wcfLog.svcLog" /> 
    </listeners> 
    </source> 
</sources> 
</system.diagnostics> 
</configuration> 

其他問題,你很可能已經是跨域問題,尤其是當你第一次嘗試並訪問網站第一次與silverlight客戶端。您應該在網站的根目錄添加一個crossdomain.xml和一個clientaccesspolicy.xml。

這些都應該包含這樣的XML:

的crossdomain.xml

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"> 
<cross-domain-policy> 
    <allow-http-request-headers-from domain="*" headers="*" /> 
</cross-domain-policy> 

ClientAccessPolicy。XML

<?xml version="1.0" encoding="utf-8"?> 
<access-policy> 
    <cross-domain-access> 
    <policy> 
     <allow-from http-request-headers="*"> 
     <domain uri="*"/> 
     </allow-from> 
     <grant-to> 
     <resource include-subpaths="true" path="/"/> 
     </grant-to> 
    </policy> 
    </cross-domain-access> 
</access-policy> 

Silverlight客戶端會嘗試在您的網站的根目錄訪問這些文件,所以你應該從那裏爲他們服務,這應該是簡單的,如果它是託管在IIS的ASP網站。 Details on MSDN

如果您的服務是獨立託管的,但您可以提供WCF服務來提供服務,但設置起來會更復雜。 Some details on a self hosted solution