Использование wcf для показа SyndicationFeedFormatter ИЛИ IList <SyndicationItem> - PullRequest
0 голосов
/ 09 мая 2009

Я хотел бы предоставить SyndicationFeedFormatter с wcf и basicHttpBinding. Я продолжаю получать ошибки, подобные показанным ниже. Я включил интерфейс / класс и конфигурацию wcf web.config.

Я пытался выставить SyndicationFeedFormatter, а также IList, но не смог обойти следующую ошибку. Кто-нибудь смог это сделать или кто-то подтвердил, в чем проблема?

thx - Дэйв

Сообщение об ошибке

System.ServiceModel.Dispatcher.NetDispatcherFaultException: средство форматирования выдало исключение при попытке десериализации сообщения: при попытке десериализации параметра произошла ошибка http://tempuri.org/:GetFeaturesResult. Сообщение InnerException было «Ошибка в строке 1, позиция 123. Элемент http://tempuri.org/:GetFeaturesResult' содержит данные контракта данных http://schemas.datacontract.org/2004/07/System.ServiceModel.Syndication:Rss20FeedFormatter'

Мой интерфейс / контракт выглядит как

[ServiceContract]
[ServiceKnownType(typeof(Atom10FeedFormatter))]
[ServiceKnownType(typeof(Rss20FeedFormatter))]
public interface IGetData {

    [OperationContract]
    SyndicationFeedFormatter GetFeatures();

    [OperationContract]
    IList<SyndicationItem> GetFeatures2();

}

Мой метод выглядит так ...

    public SyndicationFeedFormatter GetFeatures()() {
        // Generate some items...
        SyndicationFeed feed = new SyndicationFeed() {
            Title = new TextSyndicationContent("Mike's Feed"),
            Description = new TextSyndicationContent("Mike's Feed Description")
        };

        feed.Items = from i in new int[] { 1, 2, 3, 4, 5 }
                     select new SyndicationItem() {
                         Title = new TextSyndicationContent(string.Format("Feed item {0}", i)),
                         Summary = new TextSyndicationContent("Not much to see here"),
                         PublishDate = DateTime.Now,
                         LastUpdatedTime = DateTime.Now,
                         Copyright = new TextSyndicationContent("MikeT!"),
                     };

        return (new Rss20FeedFormatter(feed));
    }

    public IList<SyndicationItem> GetFeatures2() {

        List<string> includeList = new List<string>();
        includeList.Add("Feature");

        IList<SyndicationItem> mylist = ReaderManager.GetFeedByCategory2(includeList, null, null);
        return mylist;

    }

Мой web.config выглядит следующим образом

binding = "webHttpBinding" contract = "SLNavigationApp.Web.IGetData"> ->

         <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />

     </service>
 </services>

 <behaviors>
     <endpointBehaviors>
         <behavior name="webHttpBehavior">
             <webHttp />
         </behavior>
     </endpointBehaviors>
     <serviceBehaviors>
         <behavior name="SLNavigationApp.Web.GetDataBehavior">
             <serviceMetadata httpGetEnabled="true" />
             <serviceDebug includeExceptionDetailInFaults="true" />
         </behavior>
    </serviceBehaviors>
 </behaviors>

Ответы [ 2 ]

1 голос
/ 09 мая 2009

Я в замешательстве: вы используете WebHttpBinding или BasicHttpBinding? Вы определенно должны использовать первое, и это должно сработать.

Если вы пытаетесь использовать BasicHttpBinding, вы не против поделиться, почему? Классы SyndicationFeedFormatter не являются DataContracts или XmlSerializable (что вам необходимо для поддержки BasicHttpBinding), поэтому в этом случае он, скорее всего, не будет работать, если вы не выполнили немного дополнительной работы. Скорее всего, я бы попытался обойти это, просто изменив мой ServiceContract, чтобы он вместо этого возвращал объекты Message, например:

[ServiceContract]
[ServiceKnownType(typeof(Atom10FeedFormatter))]
[ServiceKnownType(typeof(Rss20FeedFormatter))]
public interface IGetData {
    [OperationContract]
    Message GetFeatures();

}

...

SyndicationFeedFormatter frm = new Rss20FeedFormatter(feed);
return Message.CreateMessage(
   MessageVersion.None, "GetFeatures", 
   new FeedBodyWriter(frm)
   );

...

class FeedBodyWriter : BodyWriter {
   SyndicationFeedFormatter formatter;
   public FeedBodyWriter(SyndicationFeedFormatter formatter) : base(false) {
      this.formatter = formatter;
   }
   protected override void OnWriteBodyContents(XmlDictionaryWriter writer) {
      formatter.WriteTo(writer);
   }
}
0 голосов
/ 02 апреля 2010

Круто, мне было интересно, почему мой сервис не производит контент, читаемый браузером. Я также использовал basicHttpBinding (потому что все остальные вызовы сделаны из Silverlight).

Как несвязанный sidenote:

Вы можете изменить: от i в новом int [] {1, 2, 3, 4, 5}

Кому: от меня в Enumerable.Range (1, 5)

Это может быть очень удобно! Я обычно использую его как «Enumerable.Range (1, pagecount)» в запросе XLINQ, когда я извлекаю выгружаемые XML-данные с сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...