我试图使用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代表列表中的条目数。
任何想法如何进行?
那么你可以调试到'GetState'方法,并看到**什么**为NULL? – 2011-03-06 15:36:09
我假设你的'ServiceDataContext'不能创建出于某种原因(不知道是什么原因) - 这就是错误信息似乎指向... – 2011-03-06 15:52:18
不幸的是,我不能用调试器进入代码。我已经根据这里的说明安装了web.config文件:http://msdn.microsoft.com/en-us/library/bb157687.aspx但我仍然无法调试代码。有关如何进入代码的任何想法? – Mark 2011-03-06 15:52:32