2010-07-20 2 views
4
.

. У меня есть служба обслуживания WCF, работающая на другом сервере, настроенная с атрибутом WebGet, для ответа на метод HTTP Get. Я знаю, что сервис работает правильно, потому что я могу позвонить службе непосредственно через браузер и вручную сделать Get with Fiddler и получить правильный ответ.WCF-прокси, использующий почту, хотя атрибут WebGet указан (только при вызове из другой службы WCF). - Причины ошибки 405.

У меня есть проект ASP.Net на моей локальной машине, который вызывает эту услугу с помощью следующего кода:

Proxy Interface '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 'Method not allowed'. Когда мы смотрим на журналы IIS на удаленном сервере, мы видим, что прокси-сервер ProductService делает запрос HTTP GET, когда вызов метода инициируется со страницы, но он делает запрос HTTP POST, когда метод вызывается из службы WCF. Метод POST не настроен на службу, поэтому ошибка 405.

Даже если страница и служба находятся в одной и той же папке и пространстве имен, мы по-прежнему получаем ту же ошибку из службы. Если мы используем классическую мыльную услугу asmx, вместо этого выполняется GET-вызов, и служба выполняет и отвечает правильно. Если мы вручную сделаем получение из службы WCF с помощью объекта System.Net.WebRequest, вызов службы завершится успешно.

В нижней строке, прокси-сервер WCF пытается выполнить POST вместо GET при использовании из другого сервиса WCF Rest, но работает правильно, когда используется со страницы или в любом другом месте.

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

ответ

6
+6

WCF такая хорошая идея. Почему это так много? – Brett

+0

@ Бретт: технологии Microsoft требуют 10 лет для стабилизации. Не знаю, почему, может быть, это качество программистов или сложность структуры. –

+3

Это стремление Microsoft обслуживать дизайнеров, управляемых дизайнерами, в сочетании с обнадеживающими плохими практиками, которые всегда заканчиваются кластерной волной раздутой, плохо выполненной техники, которая задерживается до неизбежного переписывания - оставляя человечество лет наследия технологический долг на своем пути. – mythz