No problem.  Probably I should've been a bit more explicit in
reference to the setup.

My WCF service is hosted in IIS 7, and the Stream and Callback classes
I mentioned are in the same solution as the WCF endpoint.  Also, you
have to add a line to your web.config file to reference the
IHttpHandler subclass (Callback class) so that WCF will recognize it.
Further, even though I added that reference to my web.config IIS 7
STILL didn't recognize it.  I had to explicitly add the module
reference by way of IIS's Modules area.  Now, it could be that this
was a cache issue or something, and that IIS would've recognized my
web.config entry at some point.

I will likely refactor this and try to move the Stream and Callback
classes to a separate assembly so that any future WCF services could
use them again.  I haven't tried this out yet but should work fine.

Good luck.

On Oct 24, 10:23 am, RWF <[EMAIL PROTECTED]> wrote:
> thanks tenacious for all the help.  It sounds like i would just ditch
> my IIS hosted WCF service, i was under the impression from this 
> link:http://msdn.microsoft.com/en-us/library/cc716898.aspx
> that it was some how possible to rig WCF to format the response
> natively but the solution it referrers to does not exist in the
> samples download.
>
> On Oct 24, 9:00 am, tenaciousd <[EMAIL PROTECTED]> wrote:
>
> > Er, "bugger" should've been "buffer".  Quite a typo.
>
> > On Oct 24, 9:58 am, tenaciousd <[EMAIL PROTECTED]> wrote:
>
> > > My service setup isn't exactly the same as yours but I think the same
> > > solution will work for you.
>
> > > You'll need to add two classes, one that inherits from Stream (we'll
> > > call is JsonStream) and another that inherits from the IHttpModule
> > > interface (we'll call this JsonModule).  The JsonStream class will
> > > need a public property to store the name of the callback (e.g.
> > > CallbackFunctionName).
>
> > > JsonModule's Init needs to first look for all RequestType = GET and,
> > > for all such requests, do a GetValues on "callback" to see if the
> > > caller expects us to make a callback or simply return data.  If a
> > > callback param is present we need to create a new instance of
> > > JsonStream passing the current context's Response.Filter to the
> > > constructor and then set CallbackFunctionName to the appropriate
> > > value.  Then, in JsonStream in the overridden Write method, if
> > > CallbackFunctionName has a value you need to do something like (where
> > > _stream is the value passed into JsonStream's constructor):
>
> > > string content = CallbackFunctionName + "(" +
> > > Encoding.UTF8.GetString(bugger) + ");";
> > > _stream.Write(Encoding.UTF8.GetBytes(content), 0, content.Length);
>
> > > In this way you've decoupled the callback functionality from yourWCF
> > > service(s) but it "just works" for cases that require it.  Hopefully
> > > this implementation will work in your scenario.
>
> > > On Oct 24, 9:22 am, RWF <[EMAIL PROTECTED]> wrote:
>
> > > > Thanks for the info.  How exactly are you writing directly to the
> > > > response usingWCF?  My IIS hostedWCFservice is basically just
> > > > acting like a proxy to a windows hostedWCFservice, so they both use
> > > > the same contract, but the IIS hosted service is a REST based
> > > > service.  Is there a way to maintain this uniformity of contracts,
> > > > while writing directly to the response of the IIS service?
>
> > > > On Oct 23, 8:22 am, tenaciousd <[EMAIL PROTECTED]> wrote:
>
> > > > > If you're going to do cross-domain calls you can't do a POST, only a
> > > > > GET.  I think even if you specify POST as your type jQuery will
> > > > > convert it to a GET if your datatype isjsonp(check their doc but I'm
> > > > > pretty sure that's the case).
>
> > > > > As forWCFthe key is just making sure that you wrap your return in
> > > > > the callback method and write it to the Response.  In other words, you
> > > > > can't simply have aWCFendpoint that returns a json-formatted
> > > > > object.  Instead you need to write something like
> > > > > "callbackMethodName(" + yourJSONObject + ");" to the Response.  Once
> > > > > you've done this jQuery will execute the callback call, in which it
> > > > > will do an eval() on yourJSONObject and then call the success method,
> > > > > passing it the JSON object in the data parameter.  At that point you
> > > > > will have dot notation on your JSON object.
>
> > > > > On Oct 22, 7:31 pm, RWF <[EMAIL PROTECTED]> wrote:
>
> > > > > > I am usingWCFtoo, have you done projects that require an $.ajax POST
> > > > > > request to aWCFservice cross site?  If you have, how did come up
> > > > > > with a server proxy to allow for cross site communication?
>
> > > > > > On Oct 10, 2:01 pm, tenaciousd <[EMAIL PROTECTED]> wrote:
>
> > > > > > > Nevermind.  The fundamental issue was that the json object 
> > > > > > > wrapped in
> > > > > > > the callback name does, in fact, need to be written to the 
> > > > > > > Response.
> > > > > > > I'm an idiot.  Anyway, it's working now.  If others hit the same
> > > > > > > jquery ->jsonp->wcfissue let me know.
>
> > > > > > > On Oct 10, 12:07 pm, tenaciousd <[EMAIL PROTECTED]> wrote:
>
> > > > > > > > I'm using jQuery $.ajax to make a cross-domainjsonpcall to aWCF
> > > > > > > > service.  The call is working fine, entering the service 
> > > > > > > > endpoint, but
> > > > > > > > the callback method never fires.  I've tried many permutations 
> > > > > > > > of
> > > > > > > > changes and can't seem to get this to work.
>
> > > > > > > > TheWCFendpoint is returning a string (NOT doing a 
> > > > > > > > Response.Write)
> > > > > > > > that contains a json object inside the callback wrapper (e.g.
> > > > > > > > "jsonp123( {"Author":"John Doe","Price":"$35.90"} )" ) and the 
> > > > > > > > content-
> > > > > > > > type returned from the service is application/json; 
> > > > > > > > charset=utf-8.
>
> > > > > > > > $.ajax call is below.  Any help is much appreciated.
>
> > > > > > > >         var data = {"ISBN" : $("#isbn1").val()};
>
> > > > > > > >         $.ajax({
> > > > > > > >                 type: "GET",
> > > > > > > >                 cache: false,
> > > > > > > >                 url: 
> > > > > > > > "http://localhost:63132/Widget.svc/GetProductInfo";,
> > > > > > > >                 scriptCharset: "utf-8",
> > > > > > > >                 dataType: "jsonp",
> > > > > > > >                 data: data,
> > > > > > > >                 success: function(data, textStatus){
> > > > > > > >                         alert("success");
> > > > > > > >                 },
> > > > > > > >                 error: function(XMLHttpRequest, textStatus, 
> > > > > > > > errorThrown){
> > > > > > > >                         alert('error');
> > > > > > > >                 }
> > > > > > > >         });

Reply via email to