2011-04-05 2 views
3

비트 ... 내가 동일한 데이터 층 LINQ (-으로 액세스 웹 사이트 및 여러 콘솔 응용 프로그램을나는 기본 연결이 폐쇄 오류 내 질문에 배경

이었다받을 - SQL)를 사용하여 데이터를 설정/가져옵니다. 콘솔 앱은 네트워크를 통해 실행되며 WCF 서비스를 통해 중앙 데이터베이스를 업데이트합니다. 웹 사이트는 앱 데이터로 캡처 한 데이터를 사용자에게 표시하는 데 사용됩니다.

간단한 유형을 반환하고 사용자 지정 개체의 목록을 반환 할 때 WCF 서비스가 작동하지만 IEnumerable/내에서 아무 것도 반환하지 않을 때마다 내 서비스가 '기본 연결이 닫혀있는 오류'로 처리됩니다. IQueryable.

IEnumerables/IQueryables를 WCF 서비스를 통해 반환 할 수 있다고 생각 했습니까? 가능합니까, 아니면 서비스를 잘못 구성 했습니까? 나는 wsHttpBinding 대신 basicHttpBinding을 사용하고 있지만 다른 유형을 사용하는 것이 가장 좋은 상황에서는 여전히 100 %가 아닙니다.

내 셋업은 다음과 같이이다 :

public class CageService : ICageRepository 
{ 
     public IEnumerable<Cage> GetAll() 
     { 
      var dc = new DataContext(); 
      return dc .GetAll(); 
     } 
} 


[ServiceContract] 
public interface ICageRepository : IRepository<Cage> 
{ 
    [OperationContract] 
    IEnumerable<Cage> GetAll(); 

} 

서비스 구성 :

<system.serviceModel> 

    <services> 
     <!-- Note: the service name must match the configuration name for the service implementation. --> 
     <service name="CageService" behaviorConfiguration="CageServiceTypeBehaviors" > 
     <host> 
      <baseAddresses> 
      <add baseAddress = "http://localhost/UHFWebsite/" /> 
      </baseAddresses> 
     </host> 
     <!-- Add the following endpoint. --> 
     <!-- Note: your service must have an http base address to add this endpoint. --> 
     <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" /> 


     <endpoint address ="" binding="basicHttpBinding" contract="Wavin.CageTracking.DataLayer.Interfaces.ICageRepository" /> 
     </service> 
    </services> 

    <behaviors> 
     <serviceBehaviors> 
     <behavior name="CageServiceTypeBehaviors" > 
      <!-- Add the following element to your service behavior configuration. --> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 

    </system.serviceModel> 

클라이언트 설정 :

void method() 
{ 
      var client = new CageRepositoryClient(); 
      CageListView.DataSource = client.GetAll();; 
      CageListView.DataBind(); 
} 
,536 :

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="BasicHttpBinding_ICageRepository1" closeTimeout="00:01:00" 
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
      allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
      maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
      messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
      useDefaultWebProxy="true"> 
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
      maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <security mode="None"> 
      <transport clientCredentialType="None" proxyCredentialType="None" 
       realm="" /> 
      <message clientCredentialType="UserName" algorithmSuite="Default" /> 


      </security> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost:2000/UHFServices/CageService.svc" 
     binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ICageRepository1" 
     contract="CageRepositoryClient.ICageRepository" name="BasicHttpBinding_ICageRepository1" /> 
    </client> 
    </system.serviceModel> 

호출하는 코드의 모습

답변

6

인터페이스 구현시 서비스의 알려진 유형에 Cage 클래스를 추가해야합니다.

[ServiceBehavior] 
[ServiceKnownType(typeof(Cage))] 
public class CageRepository: ICageRepository 
{ 
... 
+0

'케이지 (Cage) '는 이미 알려진 유형 일 수 있습니다. –

+0

정확히 내가 필요로하는 것. .. 고마워! –

+0

관심 밖의 .. 왜 서비스가 잘 개체 목록을 반환하지만 IEnumerbale 개체의 목록을 먼저 알려진 형식으로 개체를 선언하지 않고 반환 할 것이라고 설명 할 수 있습니까? –

2

데이터 컨텍스트에서 가져온 데이터에 ToList()을 부르지 않는 것 같습니다. 이것은 일반적으로 반환하는 것이 데이터가 아니고 쿼리 자체이기 때문에 ORM의 문제의 원인입니다.

그래서 당신은 사용할 필요가 :

dataContext.All().ToList(); 
+0

가능한 경우 반환하는 호출을 입력하지 않기를 바랍니다. 목록 대신 쿼리를 반환하는 것이 좋습니다. .ToList()를 추가하면 IEnumerable의 List isntead가 반환됩니다. –

+1

목록 은 IEnumerable에 캐스팅 할 수 있습니다. 어느 쪽이든 당신의 문제는 쿼리를 열거하기 전에 wcf 연결이 닫혀 있다는 것입니다. 연결하기 전에 연결을해야합니다. 예를 들어 .ToList() 또는 다른 것을 호출하여 쿼리 대신 실제 데이터를 가질 수 있습니다. – asawyer

+0

@ 존, 왜 당신은'IEnumerable'을 돌려 주길 원합니까? WCF 서비스 호출에 비해 무의미한 지연된 실행 가능성에 관심이 없다고 가정합니다.asawyer 언급에서'List '은'IEnumerable '과 호환됩니다. –

2

이 간단한 변화가 작동하지 않는 어떤 이유가 있습니까? 그렇다면 오류가 무엇입니까?

public IEnumerable<Cage> GetAll() 
{ 
    var dc = new DataContext(); 
    return dc.GetAll().ToList(); 
} 

편집 - 귀하의 게시물에서 귀하가 IEnumerable이 linq 쿼리라고 생각할 수 있다는 인상을받습니다. 예를 들어 List 개체에서 IEnumerable을 만드는 완벽하게 유효한 명령문입니다.이 형식은 T 형식의 항목 시퀀스가 ​​단순합니다.

IEnumerable<int> ints = new List<int>(new int[] { 1, 2, 3 }); 
+0

당신은 내가 List를 IEnumerable에서 파생시킬 수 있다는 것을 이해하지 못했기 때문에 답을 얻었습니다. 내가 가진 유일한 문제는 IEnumerable로 반환하는 모든 메서드에 ToList()를 추가했을 것입니다. 그러나 그것은 내가 원하는 방식으로 인터페이스와 웹 사이트를 계속 사용할 수있게 해줬습니다. 내 마지막 해결책은 플로의 하나였습니다 –

관련 문제