2011-03-06 50 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