2011-03-06 13 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は、私がストアドプロシージャ呼び出しの結果を格納していたに一時テーブルです。ブラウザからWebサービスを呼び出すと、次のエラーが発生します。

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(); 
    } 
} 

私は、このコード(ないストアドプロシージャを使用している場合)私は、私は)ServiceDataContext(LINQ to SQLのは、正常に動作することを前提としたテーブルから結果を取得しています:

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クエリ関数を使用しました。ここでは、最終的なコードは次のとおりです。

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を渡している - SQL呼び出しの「場所」の文にP4パラメータを、私はその後、SQLビューを表し、「一覧マック」への変数のクエリを渡しますlinqからsqlへ最後に、リストの内容をGetState WebGet呼び出しに戻しています。

+0

誰かがストアドプロシージャで動作するソリューションを持っている場合は、それを共有してください。ストアドプロシージャによるコーディングははるかに簡単でクリーンで、データ取得ロジックはSQLサーバー側で行います(私の個人的な意見と個人的な好み)。 – Mark

0

私はGetStateByLongLat()がnullを返すと考えています。 ToList()は、 'オブジェクト参照がオブジェクトのインスタンスに設定されていません。'をスローします。エラー。

+0

私はSOAPベースのサービスでこのsprocをテストしましたが、そこに結果を返しています。また、私はコンソールベースのクライアントアプリケーション(Webサービス経由で結果を公開することなく)としてそれをテストし、うまくいきます。私が推測するところは、GetStateByLongLat()の結果がListに結果を正しく渡さないということです。しかし、これはちょうど野生の推測で、コードにステップインして正確に何が起こっているか見ることはできません。 – Mark

+0

古いスタイルのデバッグ:明示的に:変数に結果を入れ、ヌルをチェックし、それを反復して新しいリストに追加リストを返す –

+0

私はもうエラーは出ません(私はそれがlinq SQL認証の問題)。これは私が使用している現在のコードですが、値として0を保持しています。 – Mark