У меня служба Restful WCF на другом сервере, настроенная с атрибутом WebGet для ответа на метод HTTP Get.Я знаю, что служба работает правильно, потому что я могу вызвать службу напрямую через браузер, вручную выполнить Get с Fiddler и получить правильный ответ.
У меня есть проект Asp.NET на моей локальной машине, который вызывает эту функциюсервис со следующим кодом:
Прокси-интерфейс '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);
}
}
Реализация 'ProductService':
using System.ServiceModel;
namespace Hugo.Infrastructure.Services.Products
{
public class ProductService : ClientBase<IProductService>, IProductService
{
public TitleDto GetTitleById(string id)
{
return Channel.GetTitleById(id);
}
}
}
Связанный раздел Web.config:
<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>
Это прекрасно работает, когда мы вызываем метод со страницы в проекте, однако он выдает ошибку в этой строке return Channel.GetTitleById(id);
, когда мы вызываем его из службы WCF из того же проекта.Мы получаем ошибку HTTP 405 «Метод не разрешен».Когда мы просматриваем журналы IIS на удаленном сервере, мы видим, что прокси-сервер ProductService делает запрос HTTP GET, когда вызов метода инициируется со страницы, но он делает запрос HTTP POST, когда метод вызывается из службы WCF.Метод POST не настроен в службе, поэтому ошибка 405.
Даже если страница и служба находятся в одной папке и пространстве имен, мы все равно получаем ту же ошибку от службы.Если вместо этого мы используем классический мыльный сервис asmx, то выполняется вызов GET, и сервис выполняется и отвечает правильно.Если мы вручную выполняем получение из службы WCF с использованием объекта System.Net.WebRequest, вызов службы завершается успешно.
В итоге прокси-клиент WCF пытается выполнить POST вместо GET при использовании изнутридругой сервис WCF Rest, но работает корректно при использовании со страницы или где-то еще.
Помогите, пожалуйста!