2011-03-06 31 views
0

我試圖使用WCF實現一個REST服務,它將採用參數P1,P2,P3,P4並將它們傳遞給將執行查詢並返回結果的存儲過程。WCF REST WebServiceHostFactory使用LINQ到SQL

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

如果我用這個代碼(而不是存儲過程)我得到從表中的結果,所以我假設的LINQ to SQL工作正常(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? – 2011-03-06 15:36:09

+0

我假設你的'ServiceDataContext'不能創建出於某種原因(不知道是什麼原因) - 這就是錯誤信息似乎指向... – 2011-03-06 15:52:18

+0

不幸的是,我不能用調試器進入代碼。我已經根據這裏的說明安裝了web.config文件:http://msdn.microsoft.com/en-us/library/bb157687.aspx但我仍然無法調試代碼。有關如何進入代碼的任何想法? – Mark 2011-03-06 15:52:32

回答

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 - P4參數的SQL調用的「裏」的聲明,然後我通過變量查詢「列表蘋果」,它代表了SQL視圖作爲LINQ到SQL。最後,我將列表內容返回給GetState WebGet調用。

+0

如果有人使用存儲過程的解決方案,請分享它。存儲過程的編碼更加簡單和清晰,數據檢索邏輯在SQL服務器端完成(我的個人意見和個人偏好)。 – Mark 2011-03-08 20:41:08

0

我在想GetStateByLongLat()返回null。然後ToList()會拋出'未設置對象實例的對象引用'。錯誤。

+0

我已經在基於SOAP的服務中測試了這個存儲過程,它返回結果。我也測試過它作爲基於控制檯的客戶端應用程序(無需通過Web服務公開結果),並且工作正常。我懷疑來自GetStateByLongLat()的結果沒有正確地將結果傳遞給List。但是這只是一個瘋狂的猜測,因爲我無法進入代碼,看看那裏到底發生了什麼。 – Mark 2011-03-07 20:33:38

+0

舊樣式調試:明確地做事:將結果放入變量中,檢查null,迭代它並將其添加到新列表中,返回列表 – 2011-03-07 21:03:29

+0

我沒有再收到錯誤(我認爲它與linq有關sql認證問題)。這是我正在使用的當前代碼,但它的值爲0。 – Mark 2011-03-07 22:53:22