c# - válido - http error 405.0 method not allowed
ProtocolException Unhandled/(405) Método no permitido con WCF; Enlaces y puntos finales parecen correctos (4)
Solo estoy aprendiendo a usar WCF y estoy tratando de escribir un pequeño programa HelloWorld desde cero (tanto en el lado del host como del lado del cliente). He estado recibiendo una ProtocolException Unhandled
cada vez que mi cliente intenta usar el servicio, y no puedo entender por qué. Estoy alojando el servicio usando IIS.
En cuanto a la forma en que tengo las cosas configuradas: hago todo lo posible para separar el cliente, el proxy, el host, el servicio y el contrato, como se detalla en este video y como se describe en este article . Básicamente tengo diferentes proyectos dentro de la solución para cada uno de ellos.
Aquí hay algunos archivos diferentes que muestran de lo que estoy hablando:
Servicio
namespace HelloWorld
{
public class HelloWorldService : IHelloWorldService
{
public String GetMessage(String name)
{
return "Hello World from " + name + "!";
}
}
}
Contrato
namespace HelloWorld
{
[ServiceContract]
public interface IHelloWorldService
{
[OperationContract]
String GetMessage(String name);
}
}
Apoderado
namespace HelloWorld
{
public class Proxy : ClientBase<IHelloWorldService>, IHelloWorldService
{
#region IHelloWorldService Members
public String GetMessage(String name)
{
return Channel.GetMessage(name);
}
#endregion
}
}
Cliente
namespace Client
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click_1(object sender, EventArgs e)
{
Proxy proxy = new Proxy();
MessageBox.Show(proxy.GetMessage(textBox1.Text));
}
}
}
El cliente es solo un formulario con un cuadro de texto y un botón, e intenta ejecutar GetMessage () usando lo que está en el cuadro de texto como parámetro. Hay otra clase que realmente crea una instancia de la forma.
Aquí está mi web.config para el sitio web:
Web.config
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceTypeBehaviors">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service name="HelloWorld.HelloWorldService" behaviorConfiguration="MyServiceTypeBehaviors">
<endpoint address="http://localhost:8002/" binding="basicHttpBinding" contract="HelloWorld.IHelloWorldService"/>
<endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex"/>
</service>
</services>
</system.serviceModel>
</configuration>
Y aquí está mi app.config que va con el cliente:
app.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<client>
<endpoint address="http://localhost:8002/" binding="basicHttpBinding" contract="HelloWorld.IHelloWorldService" />
</client>
</system.serviceModel>
</configuration>
Mi archivo svc es muy corto, solo:
HelloWorldService.svc
<%@ServiceHost Service="HelloWorld.HelloWorldService"%>
Sé que el servicio se está ejecutando, porque cuando navego a http://localhost:8002/HelloWorldService.svc
en mi navegador aparece la pantalla que dice:
Usted ha creado un servicio.
Para probar este servicio, deberá crear un cliente y usarlo para llamar al servicio.
Así que aquí es donde ocurre el problema: el servicio se ejecuta con IIS, inicio una instancia del cliente, aparece la ventana con el cuadro de texto y el botón, escribo algunas letras, presiono el botón, y luego el programa se cuelga y yo obtener la ProtocolException Unhandled, (405) Method not allowed.
El error ocurre en esta línea de la clase Proxy:
return Channel.GetMessage(name);
He estado tratando de resolver esto durante horas y horas, y no he progresado mucho. Si alguien pudiera al menos apuntarme en la dirección correcta, estaría muy agradecido.
Lo último: quiero escribir el cliente y el proxy desde cero, sin usar svcutil.exe.
Debe especificar la dirección completa para su servicio en la etiqueta de punto final de la configuración del Cliente
address = "http: // localhost: 8002 / HelloWorldService.svc", donde pone las mismas configuraciones de punto final.
Funcionó para mí mientras estaba atrapado en el infierno ...
Debe especificar la dirección completa para su servicio en la etiqueta de punto final de la configuración del Cliente. Me gusta esto:
<endpoint address="http://localhost:8002/HelloWorldService.svc" binding="basicHttpBinding" contract="HelloWorld.IHelloWorldService" />
No olvide agregar la extensión ''.svc'' después de su nombre de servicio en el atributo de dirección de la etiqueta de punto final. Funcionó para mí Espero que tengas la solución ahora.
La configuración del cliente se verá así:
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_IService"/>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:61569/Service1.svc" binding="wsHttpBinding"
bindingConfiguration="WSHttpBinding_IService" contract="WcfServiceApp.IService1" name="WSHttpBinding_IService"/>
</client>
El motivo por el que funciona cuando vas a la dirección base (.svc) es que se trata de una operación HTTP GET para obtener los metadatos del servicio. Cuando llama a un método en su contrato de servicio, está haciendo una operación POST y lo más probable es que simplemente no tenga esta característica habilitada. Dependiendo de la versión de .NET a la que se dirige, será uno de estos resaltados en rojo.
Ok, encontré una solución, aunque no estoy del todo seguro de por qué funciona. Supongo que cuando está usando Cassini o IIS o lo que sea para alojar el sitio web, no debe especificar una dirección en el punto final en el archivo web.config. Todo lo que tuve que hacer fue cambiarlo a address=""
y comenzó a funcionar correctamente. Asegúrate de asegurarte de que el puerto en el que tu servidor aloja el servicio coincida con el código en tu archivo app.config.