2015-05-27 71 views
1

所以這裏的交易:dojo.xhrGet不能夠調用WCF GET方法與WCF支持返回的DbContext對象

我有這樣定義的方法的操作合同:

[OperationContract] 
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)] 

aspnet_Users GetUsers(); 

當我測試的方法,在WCF測試客戶端,我得到的結果很好,但是當我送一個dojo GET請求,我得到一個錯誤

504:「[提琴手] ReadResponse()失敗:服務器未返回完成請求。服務器返回0字節。 「

無論是從在這種情況下幫助以前類似問題的解決這裏的道場電話和網絡配置:

var request = dojo.xhrGet({ 
    url: 'http://localhost/Authentication/Service1.svc/GetUsers', 
    handleAs: "json", 
    contentType: "application/json", 
    headers: { 
     "Content-Type": "application/json; charset=UTF-8", 
     "Access-Control-Allow-Origin": "*" 
    }, 
    load: doSomething, 
    error: OnError 
}); 

<system.serviceModel> 
    <behaviors> 
     <endpointBehaviors> 
     <behavior name="MyAppServiceAspNetAjaxBehavior"> 
      <enableWebScript /> 
     </behavior> 
     <behavior name="web"> 
      <enableWebScript /> 
      <webHttp /> 
     </behavior> 
     </endpointBehaviors> 
     <serviceBehaviors> 
     <behavior> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
     <behavior name="ServiceBehavior"> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
      <dataContractSerializer maxItemsInObjectGraph="2147483646" /> 
      <bufferedReceive maxPendingMessagesPerChannel="2147483646" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <bindings> 
     <webHttpBinding> 
     <binding name="ServiceBinding" maxReceivedMessageSize="214748364777777" maxBufferSize="2147483647" maxBufferPoolSize="214748364777777" transferMode="Streamed"> 
      <readerQuotas maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxStringContentLength="2147483647" /> 
     </binding> 
     </webHttpBinding> 
    </bindings> 
    <services> 
     <service name="WcfAuthenticationService.Service1" behaviorConfiguration="ServiceBehavior"> 
     <endpoint address="" binding="webHttpBinding" contract="WcfAuthenticationService.IService1" behaviorConfiguration="web" bindingConfiguration="ServiceBinding"/> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
     </service> 
    </services> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true" /> 
    <directoryBrowse enabled="true" /> 
    </system.webServer> 
    <entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> 
    <providers> 
     <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 
    </providers> 
    </entityFramework> 
    <connectionStrings> 
    <add name="Entities" connectionString="data source=serv;initial catalog=aspnetdb;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" /> 
<add name="aspnetdbEntities" connectionString="metadata=res://*/DataModelFirst.UsersModel.csdl|res://*/DataModelFirst.UsersModel.ssdl|res://*/DataModelFirst.UsersModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=serv;initial catalog=aspnetdb;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 
</connectionStrings> 

該方法返回的DbContext實體WCF支持

我有另一種方法,返回與dojo Post方法調用的結果好,所以我的猜測是這是與DbContext ...我會非常感謝任何幫助。

+0

服務器返回504對應於超時的http代碼,因此後端調用可能花費了太多時間 - 可能是db查詢沒有優化或返回的數據太大? – vonPetrushev

+0

@Petrushev:我測試了它,當查詢應該只返回一個記錄(和表中包含三個記錄:));它仍然期待你作爲超時? – user6966

+0

...還有一件事(重要的):我有另一種方法返回結果記錄的字符串(實際上只是它的一部分,但仍然是dbcontext返回我的記錄),所以問題是當我想方法返回ado.net來自DB的對象(而不是字符串)... – user6966

回答

1

錯誤是「'aspnet_Users'無法序列化爲JSON,因爲它的IsReference設置爲'True'。 JSON格式不支持引用,因爲沒有用於表示引用的標準格式。要啓用序列化,請禁用該類型的IsReference設置或該類型的適當父類。「