WCF Data Services调试方法

    When developing your service , you might run into some issues and you want to debug your service.Imagine that you are inserting data into the store using astoria and you start getting DataServiceExceptions in your client code.The normal error message would be……

<? xml version="1.0" encoding="utf-8" standalone="yes" ?>
< error  xmlns ="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" >
  
< code ></ code >
  
< message  xml:lang ="en-US" > An error occurred while processing this request. </ message >
</ error >

    While debugging the service , you would need more information that just this generic error message.To switch to the dev error mode, you can use the following config settings.

    1) Set UseVerboseErrors to true in the ServiceConfiguration

public   class  YoruService : DataService < YourProvider >  {
   
public   static   void  InitializeService(IDataServiceConfiguration config) {       
       config.UseVerboseErrors 
=   true ;
        . . . . . .        
    }
......
}

    Once this mode is setup , your error messages look like this……

<? xml version="1.0" encoding="utf-8" standalone="yes" ?>
< error  xmlns ="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" >
  
< code ></ code >
  
< message  xml:lang ="en-US" > An error occurred while processing this request. </ message >
  
< innererror  xmlns ="xmlns" >
    
< message > An error occurred while updating the entries. See the InnerException for details. </ message >
    
< type > System.Data.UpdateException </ type >
    
< stacktrace >    at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter)&#xD;
   at System.Data.Objects.ObjectContext.SaveChanges(Boolean acceptChangesDuringSave)&#xD;
   at System.Data.Services.Providers.ObjectContextServiceProvider.SaveChanges()&#xD;
   at System.Data.Services.DataService`1.HandleNonBatchRequest(RequestDescription description)&#xD;
   at System.Data.Services.DataService`1.HandleRequest()
</ stacktrace >
    
< internalexception >
      
< message > Violation of PRIMARY KEY constraint 'PK_Region'. Cannot insert duplicate key in object 'dbo.Region'.&#xD;
The statement has been terminated.
</ message >
      
< type > System.Data.SqlClient.SqlException </ type >
      
< stacktrace >    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)&#xD;
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)&#xD;
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)&#xD;
   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)&#xD;
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)&#xD;
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)&#xD;
   at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)&#xD;
   at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()&#xD;
   at System.Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute(UpdateTranslator translator, EntityConnection connection, Dictionary`2 identifierValues, List`1 generatedValues)&#xD;
   at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter)
</ stacktrace >
    
</ internalexception >
  
</ innererror >
</ error >

 

    This works well when you have a working service all prepped up and ready to go. But , what do you do when your service won't even start ? If the service fails to initialize due to some error , you get the generic WCF Error message,which is seldom useful.The error message would look like this……

WCF Data Services调试方法_第1张图片

 

    The reason you see this and not the Pretty formatted error message from astoria is that the astoria framework never initialized the service and failed in the WCF pipeline.To see the error at this layer , you will need to

    2) Configure your Servicebehavior with the IncludeExceptionDetailInFaults attribute.

Via Code :

[System.ServiceModel.ServiceBehavior(IncludeExceptionDetailInFaults  =   true )]   
public   class  YourService : DataService < YourProvider >

Via Config :

< system.serviceModel >
    
< services >
      
< service  name ="ServiceNamespace.ServiceClassName"   behaviorConfiguration  ="DebugEnabled" >
      
</ service >
    
</ services >
    
< behaviors >
      
< serviceBehaviors  >
        
< behavior  name ="DebugEnabled" >
          
< serviceDebug  includeExceptionDetailInFaults ="True" />
        
</ behavior >
      
</ serviceBehaviors >
    
</ behaviors >
    
< serviceHostingEnvironment  aspNetCompatibilityEnabled ="true" />
</ system.serviceModel >

After setting this config , this is what the error  looks like……

WCF Data Services调试方法_第2张图片

 

 

 

 转自:http://blogs.msdn.com/b/phaniraj/archive/2008/06/18/debugging-ado-net-data-services.aspx

你可能感兴趣的:(service)