Прокси-сервер WCF, использующий сообщение, даже если указан атрибут WebGet (только при вызове из другой службы WCF) - вызывает ошибку 405 - PullRequest
4 голосов
/ 21 июля 2010

У меня служба 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, но работает корректно при использовании со страницы или где-то еще.

Помогите, пожалуйста!

1 Ответ

6 голосов
/ 21 июля 2010
...