2011-03-06 2 views
0

매개 변수 P1, P2, P3, P4 걸릴 WCF를 사용하여 REST 서비스를 구현하고 쿼리를 수행하고 결과를 반환하는 저장 프로 시저로 전달하려고합니다.WCF REST WebServiceHostFactory SQL에 linq 사용

나는 서비스에 대한 C#에서이 코드를 가지고 :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.ServiceModel; 
using System.ServiceModel.Web; 
using System.Text; 
using System.Data.Linq; 
using System.Data.Linq.Mapping; 
using System.ServiceModel.Activation; 
using System.Data; 

namespace RestServicePublishing 
{ 
    [System.ServiceModel.ServiceBehavior(IncludeExceptionDetailInFaults = true)] 
    [ServiceContract] 
    public class RestService 
    { 
    [OperationContract] 
    [WebGet] 
    public List<Simulated_service_State> GetState(decimal P1, decimal P2, decimal P3, decimal P4) 
    { 
     using (ServiceDataContext db = new ServiceDataContext()) 
     { 
      List<Simulated_service_State> states = 
       db.GetStateByLongLat(P1, P2, P3, P4).ToList(); 
      db.SubmitChanges(); 
      return states; 
     } 
    } 
    } 
} 

Simulated_Service_State 내가 저장 프로 시저 호출의 결과를 저장하고있어 할 수있는 임시 테이블입니다. 브라우저를 통해 웹 서비스를 호출하면 다음 오류가 발생합니다.

Request Error

The server encountered an error processing the request. The exception message is 'Object reference not set to an instance of an object.'. See server logs for more details. The exception stack trace is:

at RestServicePublishing.ServiceDataContext..ctor() in C:....\RestServicePublishing\Service.designer.cs:line 39 at RestServicePublishing.RestService.GetState(Decimal P1, Decimal P2, Decimal P3, Decimal P4) in C:....\RestServicePublishing\RestService.svc.cs:line 42 at SyncInvokeGetState(Object , Object[] , Object[]) at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs) at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc) at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

!!! 내가 전화

URL은 다음

http://localhost/RestServicePublishing/RestService.svc/GetState?P1=14&P2=13&P3=22&P4=55 

사람이 저장 프로 시저 및 REST WCF 서비스와 함께 작동하는 방법을 이해하는 데 도움이 수 있습니까? 임시 테이블에서 클라이언트로 값을 반환하는 방법

업데이트 그래서 내가 여기를 게시하도록하겠습니다 코멘트 섹션에 모든 데이터를 게시 할 수 없습니다. 이것은 내가 지금 사용하고 코드이지만, 그것은 나에게 내 쿼리가 테이블에서 아무것도 선택하지 않음을 의미 결과로 0을주고 :

public class RestService 
{   
    [OperationContract] 
    [WebGet (ResponseFormat = WebMessageFormat.Xml)] 
    public string GetState(decimal P1, decimal P2, decimal P3, decimal P4) 
    { 
     IList<Simulated_service_State> query = new List<Simulated_service_State>(); 
     IList<string> Mac = new List<string>(); 
     int j; 
     int jj; 

     using (ServiceDataContext db = new ServiceDataContext()) 
     { 
      query = db.GetStateByLongLat1(P1, P2, P3, P4).ToList(); 
      db.SubmitChanges(); 
      var query2 = from Simulated_service_State state in db.Simulated_service_States 
         select state.MAC; 
      Mac = query2.ToList(); 
      jj = Mac.Count; 
      j = query.Count; 
     } 
     return j.ToString() + "," + jj.ToString(); 
    } 
} 

이 코드 (하지 저장 프로 시저를 사용하는 경우) 내가 SQL에 LINQ 잘 (ServiceDataContext 작동한다고 가정 그래서 내가) 테이블에서 결과를 받고 있어요 : 내가 얻을

public class RestService 
{ 

    [OperationContract] 
    [WebGet (ResponseFormat = WebMessageFormat.Xml)] 
    public string GetState(decimal P1, decimal P2, decimal P3, decimal P4) 
    { 
     IList<Simulated_service_State> query = new List<Simulated_service_State>(); 
     IList<string> Mac = new List<string>(); 
     int j; 
     int jj; 
     using (ServiceDataContext db = new ServiceDataContext()) 
     { 
      var query3 = from SimulatedNode node in db.SimulatedNodes 
         select node.MAC; 
      Mac = query3.ToList(); 
      j = (Mac.Count); 
     } 
     return j.ToString(); 

결과는 목록의 항목 수를 나타냅니다 4입니다.

어떻게 진행할 수 있습니까?

+1

그럼'GetState' 메쏘드로 디버깅해서 ** 무엇이 NULL인지 알 수 있습니까 ?? –

+0

당신의'ServiceDataContext'가 어떤 이유인지 (그 이유가 무엇인지는 모르겠다) 만들 수 없다고 가정합니다 - 오류 메시지가 가리키는 것입니다 ... –

+0

불행히도 디버거로 코드를 실행할 수 없습니다. 여기에서 지침을 기반으로 web.config 파일을 설정했습니다. http://msdn.microsoft.com/en-us/library/bb157687.aspx 그러나 코드를 디버깅 할 수 없습니다. 코드를 단계적으로 실행하는 방법에 대한 아이디어가 있습니까? – Mark

답변

0

저장 프로 시저로 쿼리를 포기했기 때문에 결과를 제공하는 표준 SQL 쿼리 함수를 사용했습니다. -는 SQL 호출의 "여기서"문 P4 매개 변수와 내가 다음 SQL 뷰를 나타내는 "목록 맥"에 변수 쿼리를 통과

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.ServiceModel; 
using System.ServiceModel.Web; 
using System.Text; 
using System.Data.Linq; 
using System.Data.Linq.Mapping; 
using System.ServiceModel.Activation; 
using System.Data; 

namespace RestServicePublishing 
{ 
[AspNetCompatibilityRequirements(RequirementsMode =  AspNetCompatibilityRequirementsMode.Allowed)] 
[System.ServiceModel.ServiceBehavior(IncludeExceptionDetailInFaults = true)] 
[ServiceContract] 

public class RestService 
{ 

    [OperationContract] 
    [WebGet (ResponseFormat = WebMessageFormat.Json)] 
    public List<Last_status_by_LongLat> GetState(decimal P1, decimal P2, decimal P3, decimal P4) 
    { 
     List<Last_status_by_LongLat> Mac = new List<Last_status_by_LongLat>(); 

     using (ServiceDataContext db = new ServiceDataContext()) 
     { 
      var query = from view node in db.views 
         where table.param > P1 && table.param2 < P2 && table.param2 > P3 && table.param < P4 
         select table; 
      Mac = query.ToList(); 


     } 
     return Mac; 

    } 
} 
} 

나는 P1을 통과 해요 : 여기에 최종 코드는 linq as sql. 마지막에는 GetState WebGet 호출에 대한 목록 내용을 보류 중입니다.

+0

누군가 저장 프로 시저와 함께 작동하는 솔루션을 가지고 있다면 공유하십시오. 저장 프로 시저를 사용한 코딩은 훨씬 간단하고 깨끗하며 데이터 검색 논리는 SQL 서버 측에서 수행됩니다 (개인적인 견해와 개인 취향). – Mark

0

GetStateByLongLat()이 null을 반환한다고 생각합니다. 그런 다음 ToList()는 '개체 참조가 개체의 인스턴스로 설정되지 않았습니다.'를 throw합니다. 오류.

+0

SOAP 기반 서비스에서이 sproc을 테스트했으며 거기에 결과를 반환합니다. 또한 (웹 서비스를 통해 결과를 노출하지 않고) 콘솔 기반 클라이언트 응용 프로그램으로 테스트 한 결과 제대로 작동합니다. 필자가 생각하기에 GetStateByLongLat()의 결과는 List에 결과를 제대로 전달하지 못합니다. 그러나 이것은 코드에서 정확히 무엇이 일어나는지 볼 수 없기 때문에 자연스러운 추측입니다. – Mark

+0

이전 스타일의 디버깅 : 명시 적으로 작업 수행 : 결과를 변수에 넣고 null을 확인한 다음 반복하여 새로운 목록에 추가하고 목록을 반환하십시오. –

+0

오류가 더 이상 발생하지 않습니다 (linq과 관련 있다고 가정합니다). SQL 인증 문제). 이것은 현재 사용하고있는 코드이지만 0을 값으로 보유하고 있습니다. – Mark