J'ai un service WCF reposant sur un autre serveur configuré avec l'attribut WebGet pour répondre à la méthode HTTP Get. Je sais que le service fonctionne correctement car je peux l'appeler directement via le navigateur et effectuer manuellement un Get avec Fiddler et recevoir une réponse correcte.
J'ai un projet Asp.NET sur ma machine locale qui appelle ce service avec le code suivant :
Interface Proxy 'IProductService' :
using System.ServiceModel;
using System.ServiceModel.Web;
namespace Hugo.Infrastructure.Services.Products
{
[ServiceContract]
[XmlSerializerFormat]
public interface IProductService
{
[OperationContract(Name = "GetProductById")]
[WebGet(UriTemplate = "Products/Titles/{id}",
ResponseFormat = WebMessageFormat.Xml,
RequestFormat = WebMessageFormat.Xml,
BodyStyle = WebMessageBodyStyle.Bare)]
TitleDto GetTitleById(string id);
}
}
Implémentation "ProductService" :
using System.ServiceModel;
namespace Hugo.Infrastructure.Services.Products
{
public class ProductService : ClientBase<IProductService>, IProductService
{
public TitleDto GetTitleById(string id)
{
return Channel.GetTitleById(id);
}
}
}
Section Web.config connexe :
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true">
<baseAddressPrefixFilters>
</baseAddressPrefixFilters>
</serviceHostingEnvironment>
...
<client>
<endpoint address="http://server/directory/product.svc" bindingConfiguration="ProductServiceBinding" binding="webHttpBinding" behaviorConfiguration="productService" contract="Project.Infrastructure.Services.Products.IProductService" name="ProductServiceRest" />
</client>
<behaviors>
...
<endpointBehaviors>
<behavior name="productService">
<webHttp />
</behavior>
...
</endpointBehaviors>
</behaviors>
</system.serviceModel>
Cela fonctionne bien lorsque nous appelons la méthode à partir d'une page du projet, mais il y a une erreur à la ligne suivante return Channel.GetTitleById(id);
quand nous l'appelons de l'intérieur d'un service de WCF du même projet. L'erreur que nous recevons est une erreur HTTP 405 "Méthode non autorisée". Lorsque nous regardons les journaux IIS sur le serveur distant, nous voyons que le proxy ProductService fait une demande HTTP GET lorsque l'appel de la méthode est initié à partir de la page, mais il fait une demande HTTP POST lorsque la méthode est appelée à partir du service WCF. La méthode POST n'est pas configurée sur le service, d'où l'erreur 405.
Même lorsque la page et le service se trouvent dans le même dossier et le même espace de noms, nous recevons toujours la même erreur de la part du service. Si nous utilisons un service asmx soap classique à la place, un appel GET est effectué et le service s'exécute et répond correctement. Si nous faisons manuellement un get à partir du service WCF en utilisant l'objet System.Net.WebRequest, l'appel au service réussit.
En résumé, le proxy client WCF essaie de faire un POST au lieu d'un GET lorsqu'il est utilisé à partir d'un autre service WCF Rest mais fonctionne correctement lorsqu'il est utilisé à partir d'une page ou à peu près partout ailleurs.
Aidez-nous !