2012-02-15 6 views
5

He creado un servicio web REST, que funciona con Visual Studio WCF Test Client. Puede llamarlo con un sitio web que se encuentra junto a él y utiliza una clase "proxy" que se creó con svcutil.REST Error del servicio web 400 al llamar a la función

También puedo ver que el servicio está allí cuando navego al archivo .svc. (http: //localhost/service1.svc) Aparece el mensaje "Ha creado un servicio". página web.

Sin embargo

Cuando intento llamar a una función dentro del servicio, (http: //localhost/service.svc/firstName/lastName) devuelve un código de error 400.

Recientemente tuve un error separado que no pude resolver, así que encontré un tutorial en un servicio web MUY básico "http://blog.weareon.net/how-to-create-and-consume-rest-web-service-using-wcf/", que detuvo el error anterior, pero aún tiene el error 400 al intentar llamar a una función .

Mi archivo .config fue recortado al mínimo para intentar que funcione antes de que llegue demasiado lejos.

<?xml version="1.0"?> 
<configuration> 

    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 
    <system.serviceModel> 
    <services> 
     <service name="VService"> 
     <endpoint address="" binding="webHttpBinding" contract="ServiceName.IService1" behaviorConfiguration="webBehavior" /> 
     </service> 
    </services> 
    <behaviors> 
     <endpointBehaviors> 
     <behavior name="webBehavior"> 
      <webHttp/> 
     </behavior> 
     </endpointBehaviors> 

     <serviceBehaviors>   
     <behavior> 
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
      <serviceMetadata httpGetEnabled="true"/> 
      <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 

    <system.diagnostics> 
    <trace autoflush="true" /> 
    <sources> 
     <source name="System.ServiceModel" 
       switchValue="Information, Error" 
       propagateActivity="true"> 
     <listeners> 
      <add name="sdt" 
       type="System.Diagnostics.XmlWriterTraceListener" 
       initializeData= "SdrConfigExample1.e2e" /> 
     </listeners> 
     </source> 
    </sources> 
    </system.diagnostics> 

</configuration> 

En mi investigación, he encontrado cosas como, la configuración del proxy en el navegador, tipos, problemas de tamaño volver, pero ninguno ha funcionado hasta ahora.

Si tiene alguna idea, hágamelo saber. Gracias de antemano.

EDIT:

este es el XML desde el archivo de registro, gracias por los comentarios que me permita saber esto existe :)

<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent"> 
<System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system"> 
<EventID>131075</EventID> 
<Type>3</Type> 
<SubType Name="Error">0</SubType> 
<Level>2</Level> 
<TimeCreated SystemTime="2012-02-15T03:24:00.9952760Z" /> 
<Source Name="System.ServiceModel" /> 
<Correlation ActivityID="{00000000-0000-0000-0000-000000000000}" /> 
<Execution ProcessName="WebDev.WebServer40" ProcessID="3128" ThreadID="4" /> 
<Channel /> 
<Computer>ACKZ-01</Computer> 
</System> 
<ApplicationData> 
<TraceData> 
<DataItem> 
<TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Error"> 
<TraceIdentifier>http://msdn.microsoft.com/en-US/library/System.ServiceModel.Diagnostics.ThrowingException.aspx</TraceIdentifier> 
<Description>Throwing an exception.</Description> 
<AppDomain>9b0666f2-9-129737498327838293</AppDomain> 
<Exception> 
<ExceptionType>System.ServiceModel.ProtocolException, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType> 
<Message>There is a problem with the XML that was received from the network. See inner exception for more details.</Message> 
<StackTrace> 
at System.ServiceModel.Channels.HttpRequestContext.CreateMessage() 
at System.ServiceModel.Channels.HttpChannelListener.HttpContextReceived(HttpRequestContext context, Action callback) 
at System.ServiceModel.Activation.HostedHttpTransportManager.HttpContextReceived(HostedHttpRequestAsyncResult result) 
at System.ServiceModel.Activation.HostedHttpRequestAsyncResult.HandleRequest() 
at System.ServiceModel.Activation.HostedHttpRequestAsyncResult.BeginRequest() 
at System.ServiceModel.Activation.HostedHttpRequestAsyncResult.OnBeginRequest(Object state) 
at System.Runtime.IOThreadScheduler.ScheduledOverlapped.IOCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped) 
at System.Runtime.Fx.IOCompletionThunk.UnhandledExceptionFrame(UInt32 error, UInt32 bytesRead, NativeOverlapped* nativeOverlapped) 
at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP) 
</StackTrace> 
<ExceptionString>System.ServiceModel.ProtocolException: There is a problem with the XML that was received from the network. See inner exception for more details. ---&gt; System.Xml.XmlException: The body of the message cannot be read because it is empty. 
    --- End of inner exception stack trace ---</ExceptionString> 
<InnerException> 
<ExceptionType>System.Xml.XmlException, System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType> 
<Message>The body of the message cannot be read because it is empty.</Message> 
<StackTrace> 
at System.ServiceModel.Channels.HttpRequestContext.CreateMessage() 
at System.ServiceModel.Channels.HttpChannelListener.HttpContextReceived(HttpRequestContext context, Action callback) 
at System.ServiceModel.Activation.HostedHttpTransportManager.HttpContextReceived(HostedHttpRequestAsyncResult result) 
at System.ServiceModel.Activation.HostedHttpRequestAsyncResult.HandleRequest() 
at System.ServiceModel.Activation.HostedHttpRequestAsyncResult.BeginRequest() 
at System.ServiceModel.Activation.HostedHttpRequestAsyncResult.OnBeginRequest(Object state) 
at System.Runtime.IOThreadScheduler.ScheduledOverlapped.IOCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped) 
at System.Runtime.Fx.IOCompletionThunk.UnhandledExceptionFrame(UInt32 error, UInt32 bytesRead, NativeOverlapped* nativeOverlapped) 
at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP) 
</StackTrace> 
<ExceptionString>System.Xml.XmlException: The body of the message cannot be read because it is empty.</ExceptionString> 
</InnerException> 
</Exception> 
</TraceRecord> 
</DataItem> 
</TraceData> 
</ApplicationData> 
</E2ETraceEvent> 

no han estudiado completamente todavía, pensé que iba a publicar que al mismo tiempo

EDIT 2

CÓDIGO dEL SERVICIO

namespace VeryBasicService 
{ 
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together. 
    [ServiceContract] 
    public interface IService1 
    { 

     [OperationContract] 
     string GetData(int value); 

     [OperationContract] 
     CompositeType GetDataUsingDataContract(CompositeType composite); 

     [OperationContract] 
     [WebGet(UriTemplate="/{firstname}/{lastname}")] 
     string CallRestService(string firstName, string lastName);  


     // TODO: Add your service operations here 
    } 

CÓDIGO DE LA FUNCIÓN

namespace VeryBasicService 
{ 
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in code, svc and config file together. 
    public class Service1 : IService1 
    { 
     public string GetData(int value) 
     { 
      return string.Format("You entered: {0}", value); 
     } 

     public CompositeType GetDataUsingDataContract(CompositeType composite) 
     { 
      if (composite == null) 
      { 
       throw new ArgumentNullException("composite"); 
      } 
      if (composite.BoolValue) 
      { 
       composite.StringValue += "Suffix"; 
      } 
      return composite; 
     } 
     public string CallRestService(string firstName, string lastName) 
     { 
      return firstName + " " + lastName;    
     }  
    } 
} 
+0

qué el informe de su evento arrojar alguna luz sobre lo que está sucediendo? –

+2

Deseará activar el seguimiento de WCF y utilizar la herramienta de seguimiento http://msdn.microsoft.com/en-us/library/ms732023.aspx para obtener un error más detallado. –

+0

Gracias, consulte la Actualización :) Dice System.Xml.XmlException: el cuerpo del mensaje no se puede leer porque está vacío. ¿Eso viene del lado del navegador o del servidor? – Seige

Respuesta

4

Hay dos problemas que puedo ver en el código. En primer lugar, el atributo de nombre del elemento <service> en web.config solo incluye el nombre "serviceName"; si este no es el nombre completo de la clase de servicio, no se usará. En segundo lugar, no se debe utilizar para WebInvoke peticiones GET, se debe utilizar en lugar WebGet:

[WebGet(UriTemplate="/{firstname}/{lastname}")] 
+0

Qué ¿Sería un nombre completamente calificado para la clase de servicio? Soy muy nuevo en los servicios web, por lo que aún estoy tratando de entender algo. También fue originariamente WebGet, aún lo mismo desafortunadamente. – Seige

+0

Un nombre completamente calificado incluiría el namespace. 'MyNamespace.ClassName' –

+0

Gracias. Toda la información ayuda. El código en la pregunta tiene cambios ligeramente, esto funcionaría como el na ¿yo? Seige

Cuestiones relacionadas