2011-10-31 200 views
0

我试图将数据发布到WCF REST服务,我不断收到错误远程服务器返回错误:(400)错误的请求。 我的代码如下WCF REST POST JSON - 远程服务器返回错误:(400)错误的请求

的ServiceContract:

[ServiceContract(Namespace="AppointmentService")] 
public interface IAppointmentService 
{ 
    [OperationContract] 
    [WebInvoke(UriTemplate = "/edit", Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)] 
    string UpdateAppointment(AppointmentContract appointmentEntity); 
} 

服务:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)] 
public class FrontOfficeRest:IAppointmentService 
{ 
    #region Appointments 
    public string UpdateAppointment(AppointmentContract appointmentEntity) 
    { 
     AppointmentList appList = new AppointmentList(); 
     appList = appointmentDAO.GetAllAppointmentsByDocotorAndDate(Convert.ToInt32(appointmentEntity.doctorId), Convert.ToDateTime(appointmentEntity.appointmentDate)); 
     if (appList.Count > 0) 
     { 
      var chApp = appList 
       .Where(a => TimeSpan.Parse(a.startTime) == TimeSpan.Parse(appointmentEntity.startTime) 
        || (TimeSpan.Parse(a.startTime) < TimeSpan.Parse(appointmentEntity.startTime) 
        && TimeSpan.Parse(a.endTime) > TimeSpan.Parse(appointmentEntity.startTime))) 
       .Select(a => a); 

      if (chApp.Count() > 0) 
       throw new WebFaultException<string>(string.Format("The Doctor is not available between {0} and {1}", appointmentEntity.startTime, appointmentEntity.endTime), HttpStatusCode.Conflict); 
     } 
     bool updResult = appointmentDAO.UpdateAppointment(appointmentEntity); 
     OutgoingWebResponseContext ctx = WebOperationContext.Current.OutgoingResponse; 
     string retRes = string.Empty; 
     if (!updResult) 
     { 
      ctx.StatusCode = HttpStatusCode.NotModified; 
      retRes = "FAIL"; 
     } 
     else 
     { 
      retRes = "SUCESS"; 
      ctx.StatusCode = HttpStatusCode.OK; 
     } 
     return retRes; 
    } 

    #endregion 
} 

ClientCode

  string address = "http://localhost:8080/FrontOfficeRest/AppointmentService/edit"; 
      Uri uri = new Uri(address); 
      RestClientUtility utl = new RestClientUtility(); 

      utl.ExecuteRequest<string>(uri, "POST", appointment); 

    public void ExecuteRequest<T>(Uri uri, string method, object data) 
    { 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); 
     request.Method = method; 
     request.ContentType = "application/json; charset=utf-8"; 
     DataContractJsonSerializer serializer = new DataContractJsonSerializer(data.GetType()); 
     JavaScriptSerializer oSerializer = new JavaScriptSerializer(); 
     string dataAsString = oSerializer.Serialize(data); 
     byte[] byteData = UTF8Encoding.UTF8.GetBytes(dataAsString); 
     request.ContentLength = byteData.Length; 

     using (Stream requestStream = request.GetRequestStream()) 
     { 
      //requestStream.Write(byteData, 0, byteData.Length); 
      serializer.WriteObject(requestStream, data); 
     } 
     try 
     { 
      using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
      { 
       DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(T)); 
       Stream responseStream = response.GetResponseStream(); 
       //result = (T)deserializer.ReadObject(responseStream); 
      } 
     } 
     catch (WebException e) 
     { 
      using (WebResponse response = e.Response) 
      { 
       HttpWebResponse httpResponse = (HttpWebResponse)response; 
       Console.WriteLine("Error code: {0}", httpResponse.StatusCode); 
       using (Stream datat = response.GetResponseStream()) 
       { 
        string text = new StreamReader(datat).ReadToEnd(); 
        Console.WriteLine(text); 
       } 
      } 
     } 

    } 

的ServiceHost:

 string httpUri = "http://localhost:8080/FrontOfficeRest/"; 
     WebHttpBinding binding = new WebHttpBinding(); 
     binding.MaxBufferSize = 4194304; 
     binding.MaxReceivedMessageSize = 4194304; 
     WebServiceHost host = new WebServiceHost(typeof(FrontOfficeRest)); 
     host.AddServiceEndpoint(typeof(IAppointmentService), binding, httpUri + "AppointmentService"); 
     Console.WriteLine("Appointment Service"); 

我得到的错误,而使用处理请求 (HttpWebResponse响应= request.GetResponse()作为HttpWebResponse)

我使用Windows 7 IIS 7.0没有配置文件。 任何人都可以帮忙吗?

这是堆栈跟踪

<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent"> 
<System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system"> 
<EventID>131076</EventID> 
<Type>3</Type> 
<SubType Name="Error">0</SubType> 
<Level>2</Level> 
<TimeCreated SystemTime="2011-11-01T12:28:21.6198391Z" /> 
<Source Name="System.ServiceModel" /> 
<Correlation ActivityID="{478927bf-de68-45f7-8c95-be1436cd00a9}" /> 
<Execution ProcessName="ConsoleTest" ProcessID="4792" ThreadID="4" /> 
<Channel /> 
<Computer>SIDDHARTH</Computer> 
</System> 
<ApplicationData> 
<TraceData> 
<DataItem> 
<TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Error"> 
<TraceIdentifier>http://msdn.microsoft.com/en-IN/library/System.ServiceModel.Diagnostics.TraceHandledException.aspx</TraceIdentifier> 
<Description>Handling an exception.</Description> 
<AppDomain>ConsoleTest.exe</AppDomain> 
<Exception> 
<ExceptionType>System.NotSupportedException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType> 
<Message>LINQ to Entities does not recognize the method 'Int32 ToInt32(System.String)' method, and this method cannot be translated into a store expression.</Message> 
<StackTrace> 
at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.DefaultTranslator.Translate(ExpressionConverter parent, MethodCallExpression call) 
at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq) 
at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) 
at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) 
at System.Data.Objects.ELinq.ExpressionConverter.UnaryTranslator.TypedTranslate(ExpressionConverter parent, UnaryExpression linq) 
at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) 
at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) 
at System.Data.Objects.ELinq.ExpressionConverter.EqualsTranslator.TypedTranslate(ExpressionConverter parent, BinaryExpression linq) 
at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) 
at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) 
at System.Data.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input) 
at System.Data.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input, DbExpressionBinding&amp; binding) 
at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, DbExpression&amp; source, DbExpressionBinding&amp; sourceBinding, DbExpression&amp; lambda) 
at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call) 
at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod) 
at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq) 
at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) 
at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) 
at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, DbExpression&amp; source, DbExpressionBinding&amp; sourceBinding, DbExpression&amp; lambda) 
at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SelectTranslator.Translate(ExpressionConverter parent, MethodCallExpression call) 
at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod) 
at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq) 
at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) 
at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) 
at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.UnarySequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call) 
at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod) 
at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq) 
at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) 
at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) 
at System.Data.Objects.ELinq.ExpressionConverter.Convert() 
at System.Data.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable`1 forMergeOption) 
at System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption) 
at System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable&lt;T&gt;.GetEnumerator() 
at System.Linq.Enumerable.Single[TSource](IEnumerable`1 source) 
at System.Data.Objects.ELinq.ObjectQueryProvider.&lt;GetElementFunction&gt;b__3[TResult](IEnumerable`1 sequence) 
at System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle[TResult](IEnumerable`1 query, Expression queryRoot) 
at System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute[S](Expression expression) 
at System.Linq.Queryable.Single[TSource](IQueryable`1 source) 
at Orbitech.FrontOfficeDAL.AppointmentDAO.UpdateAppointment(AppointmentContract appointmentEntity) in D:\RestSample\Orbitech.FrontOffice\FrontOfficeDAL\AppointmentDAO.cs:line 127 
at Orbitech.FrontOfficeRestful.FrontOfficeRest.UpdateAppointment(AppointmentContract appointmentEntity) in D:\RestSample\Orbitech.FrontOffice\FrontOfficeRestful\FrontOfficeRest.cs:line 75 
at SyncInvokeUpdateAppointment(Object , Object[] , Object[]) 
at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]&amp; outputs) 
at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&amp; rpc) 
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&amp; rpc) 
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc&amp; rpc) 
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc&amp; rpc) 
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc&amp; rpc) 
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc&amp; rpc) 
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc&amp; rpc) 
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc&amp; rpc) 
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc&amp; rpc) 
at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet) 
</StackTrace> 
<ExceptionString>System.NotSupportedException: LINQ to Entities does not recognize the method 'Int32 ToInt32(System.String)' method, and this method cannot be translated into a store expression. 
    at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.DefaultTranslator.Translate(ExpressionConverter parent, MethodCallExpression call) 
    at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq) 
    at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) 
    at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) 
    at System.Data.Objects.ELinq.ExpressionConverter.UnaryTranslator.TypedTranslate(ExpressionConverter parent, UnaryExpression linq) 
    at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) 
    at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) 
    at System.Data.Objects.ELinq.ExpressionConverter.EqualsTranslator.TypedTranslate(ExpressionConverter parent, BinaryExpression linq) 
    at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) 
    at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) 
    at System.Data.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input) 
    at System.Data.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input, DbExpressionBinding&amp; binding) 
    at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, DbExpression&amp; source, DbExpressionBinding&amp; sourceBinding, DbExpression&amp; lambda) 
    at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call) 
    at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod) 
    at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq) 
    at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) 
    at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) 
    at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, DbExpression&amp; source, DbExpressionBinding&amp; sourceBinding, DbExpression&amp; lambda) 
    at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SelectTranslator.Translate(ExpressionConverter parent, MethodCallExpression call) 
    at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod) 
    at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq) 
    at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) 
    at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) 
    at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.UnarySequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call) 
    at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod) 
    at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq) 
    at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq) 
    at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) 
    at System.Data.Objects.ELinq.ExpressionConverter.Convert() 
    at System.Data.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable`1 forMergeOption) 
    at System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption) 
    at System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable&lt;T&gt;.GetEnumerator() 
    at System.Linq.Enumerable.Single[TSource](IEnumerable`1 source) 
    at System.Data.Objects.ELinq.ObjectQueryProvider.&lt;GetElementFunction&gt;b__3[TResult](IEnumerable`1 sequence) 
    at System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle[TResult](IEnumerable`1 query, Expression queryRoot) 
    at System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute[S](Expression expression) 
    at System.Linq.Queryable.Single[TSource](IQueryable`1 source) 
    at Orbitech.FrontOfficeDAL.AppointmentDAO.UpdateAppointment(AppointmentContract appointmentEntity) in D:\RestSample\Orbitech.FrontOffice\FrontOfficeDAL\AppointmentDAO.cs:line 127 
    at Orbitech.FrontOfficeRestful.FrontOfficeRest.UpdateAppointment(AppointmentContract appointmentEntity) in D:\RestSample\Orbitech.FrontOffice\FrontOfficeRestful\FrontOfficeRest.cs:line 75 
    at SyncInvokeUpdateAppointment(Object , Object[] , Object[]) 
    at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]&amp; outputs) 
    at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&amp; rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&amp; rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc&amp; rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc&amp; rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc&amp; rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc&amp; rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc&amp; rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc&amp; rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc&amp; rpc) 
    at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)</ExceptionString> 
</Exception> 
</TraceRecord> 
</DataItem> 
</TraceData> 
</ApplicationData> 
</E2ETraceEvent> 
+0

为了解答这个问题,你可以发送你发送给服务器的HTTP请求和它返回的响应 - 这是重要的信息。 –

+0

尝试启用的服务跟踪。跟踪将有一个例外,这将解释为什么服务器认为请求不好。 – carlosfigueira

回答

1

@SIDDHARTH如果看到堆栈跟踪,您将看到异常消息

LINQ到实体无法识别方法“的Int32 ToInt32(System.String) '方法,并且此方法不能转换为商店表达式。

在UNSER UpdateAppointment你会发现下面的代码 Convert.ToInt32(appointmentEntity.doctorId)

将字符串值转换的Int32如下图所示
INT doctorId =转换初始化APPLIST之前的方法服务类。 ToInt32(appointmentEntity.doctorId)

这是LINQ到实体

对于详细的解释检查一个shortcomming http://blog.dreamlabsolutions.com/post/2008/11/17/LINQ-Method-cannot-be-translated-into-a-store-expression.aspx

相关问题