none
Syndication com WCF com acesso direto via Browser RRS feed

  • Pergunta

  • Pessoal,

    Estou tentando elaborar um Feed (RSS/Atom) usando algumas coisas do WCF.
    Gostaria de acessar o Feed através do Browser usando uma URL direta, mas estou me batendo pra caramba e nem sei se tem como fazer.

    Criei um projeto Web com uma Interface e uma Classe (que herda da primeira).

    Interface:

    IFeed.cs
    using System;
    using System.Xml;
    using System.ServiceModel;
    using System.ServiceModel.Description;
    using System.ServiceModel.Syndication;
    using System.ServiceModel.Web;
    using System.Collections.ObjectModel;
    using System.Collections.Generic;

    namespace WcfSyndication
    {
        [ServiceContract]
        [ServiceKnownType(typeof(Atom10FeedFormatter))]
        [ServiceKnownType(typeof(Rss20FeedFormatter))]
        public interface IFeed
        {
            [OperationContract]
            [WebGet]
            SyndicationFeedFormatter GetRss();

            [OperationContract]
            [WebGet]
            SyndicationFeedFormatter GetAtom();
        }
    }


    Classe:

    Feed.cs
    using System;
    using System.Xml;
    using System.ServiceModel;
    using System.ServiceModel.Description;
    using System.ServiceModel.Syndication;
    using System.ServiceModel.Web;
    using System.Collections.ObjectModel;
    using System.Collections.Generic;

    namespace WcfSyndication
    {
        [ServiceContract]
        [ServiceKnownType(typeof(Atom10FeedFormatter))]
        [ServiceKnownType(typeof(Rss20FeedFormatter))]
        public class Feed : IFeed
        {
            private SyndicationFeed GetFeed()
            {
                SyndicationFeed feed = new SyndicationFeed("Teste", "Descrição do teste do Syndication.", new Uri("http://"));
                IList<SyndicationItem> items = new List<SyndicationItem>();

                feed.Categories.Add(new SyndicationCategory("cat 01"));
                feed.Categories.Add(new SyndicationCategory("cat 02"));
                feed.Categories.Add(new SyndicationCategory("cat 03"));
                feed.Authors.Add(new SyndicationPerson("teste@email.com", "Fulano de Tal", ""));
                feed.Language = "pt-br";

                items.Add(new SyndicationItem("Titulo 01", "ononnon nonono on", new Uri("http://")));
                items.Add(new SyndicationItem("Titulo 01", "ononnon nonono on", new Uri("http://")));
                items.Add(new SyndicationItem("Titulo 01", "ononnon nonono on", new Uri("http://")));

                feed.Items = items;

                return feed;
            }

            public System.ServiceModel.Syndication.SyndicationFeedFormatter GetRss()
            {
                return new Rss20FeedFormatter(this.GetFeed());
            }

            public System.ServiceModel.Syndication.SyndicationFeedFormatter GetAtom()
            {
                return new Atom10FeedFormatter(this.GetFeed());
            }
        }
    }


    A partir disto, gostaria de poder acessar da seguinte forma:
    http://localhost/Syndication/Feed/GetAtom
    ou
    http://localhost/Syndication/Feed/GeRss

    Existe possibilidade de fazer isso, sem que tenha que criar em Handler pra isso??

    Valeu !!!
    terça-feira, 30 de dezembro de 2008 21:09

Respostas

  • Ola Danilo,

    Você está criando o serviço baseando-se no arquivo *.svc? Se sim, então é necessário que você coloque a extensão do arquivo na URL para acessá-lo.

    Caso você não queira colocar a extensão *.svc, então terá mesmo que criar um módulo para interceptar a requisição e, sobrescrever a mesma para apontar para o arquivo *.svc. Já se estiver utilizando o IIS 7, pode fazer via "rules".

    segunda-feira, 5 de janeiro de 2009 13:11
    Moderador

Todas as Respostas

  • Ola Danilo,

    Eu acredito que o problema esteja no endereço que você colocou nas instâncias do Uri nos Feeds, ou seja, só tem o "http://", onde o correto seria você especificar o endereço até a matéria, post, etc.

    O que eu costumo fazer é sempre habilitar os erros durante o desenvolvimento, permitindo que as exceções sejam propagadas para o cliente, contendo a stack strace, o que facilita muito para depuração. Como já deve saber, pode habilitar isso de forma declarativa ou imperativa. Eis abaixo um exemplo:

    using (WebServiceHost host = new WebServiceHost(typeof(Servico), new Uri[] { new Uri("...") }))
    {
        ServiceDebugBehavior debug = host.Description.Behaviors.Find<ServiceDebugBehavior>();
        if (debug == null)
        {
            debug = new ServiceDebugBehavior();
            host.Description.Behaviors.Add(debug);
        }

        debug.IncludeExceptionDetailInFaults = true;

        host.Open();
        Console.ReadLine();
    }


    Ou declarativamente:


        <behaviors>
          <serviceBehaviors>
            <behavior name="ServiceBehavior">
              <serviceDebug includeExceptionDetailInFaults="true"/>
            </behavior>
          </serviceBehaviors>
        </behaviors>

    quarta-feira, 31 de dezembro de 2008 13:37
    Moderador
  • Israel, blz?

    Os "http://" que coloquei nas instâncias dos Feeds, acredito eu, não tem impacto no problema que estou tendo (pelo menos, não ainda!!!).

    Quando acesso via URL apenas ocorre erro 404 de arquivo não existente.

    No exemplo que deu acima, você apresenta uma aplicação console criando um Host com um endereço determinado. Esse teste eu havia feito e estava funcionando perfeitamente. A minha questão é, fazer isso funcionar na Web, com acesso direto do browser, como se fosse um ashx.

    Ao final das contas, eu acho que o que eu quero é fazer um REST, mas estou me batendo mais que tudo! Estou quase abortando a opção de usar o WCF pra isso..

    Valeu !!
    segunda-feira, 5 de janeiro de 2009 12:57
  • Ola Danilo,

    Você está criando o serviço baseando-se no arquivo *.svc? Se sim, então é necessário que você coloque a extensão do arquivo na URL para acessá-lo.

    Caso você não queira colocar a extensão *.svc, então terá mesmo que criar um módulo para interceptar a requisição e, sobrescrever a mesma para apontar para o arquivo *.svc. Já se estiver utilizando o IIS 7, pode fazer via "rules".

    segunda-feira, 5 de janeiro de 2009 13:11
    Moderador
  • Eu imaginava que teria que fazer algo do tipo.
    Na realidade, eu não criei o *.svc. Tinha idéia de fazer direto, usando algo semelhante ao REST.
    Vou manter o meu "Generic Handler" (*.ashx)

    Valeu!!
    segunda-feira, 5 de janeiro de 2009 17:20