Showing posts with label migrating. Show all posts
Showing posts with label migrating. Show all posts

Monday, March 26, 2012

Accessing a WebService-Method

Hello, i was migrating from Atlas July-CTP to Beta 2.

Now get an error when i call my webservice from javascript and the message is talking about System.InvalidOepration and authentication failed,

but only when I mark the corresponding method with EnableSession= true. In Atals JulyCTP the same call worked fine. Is there maybe a change in security-model?

Did I forget something or a declarartion is not set right?

Can anybody explain?

Hallo Michael,

can you show us the code of youre WebService definition?

Servus
Klaus


Check to see if your Web service definition has the ScriptService attribute (http://ajax.asp.net/docs/mref/8bb8cdde-6050-e492-e72a-eed2242c213c.aspx).
I believe the CTP version didn't have this attribute.


using System;

using System.IO;

using System.Web;

using System.Collections;

using System.Collections.Generic;

using System.Threading;

using System.Web.Services;

using System.Web.Services.Protocols;

using System.Xml.Serialization;

using System.Web.UI.WebControls;

using Microsoft.Web.Script.Services;

[ScriptService]

[WebService(Namespace ="http://tempuri.org/")]

[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

publicclass VehicleDataService : System.Web.Services.WebService

{

This Method is accessible, because it's called from Ajax:AutoCompleteExtender

[WebMethod(EnableSession =true)]

publicstring[] GetColors(string prefixText,int count)

{

string[] autoCompleteColors =null;

//Ablauf analog zu oben lediglich für Color statt für Model/Manufacturer

User user = SessionData.User;

if (autoCompleteColors ==null)

{

autoCompleteColors = VehicleDataUtils.GetColorsAsStringList(user);

}

int index =Array.BinarySearch(

autoCompleteColors, prefixText,

newCaseInsensitiveComparer());

if (index <0)

{

index = ~index;

}

int matchingCount;

for (matchingCount =0; matchingCount < count

&& index + matchingCount < autoCompleteColors.Length; matchingCount++)

{

if (!autoCompleteColors[index + matchingCount].StartsWith(

prefixText,StringComparison.CurrentCultureIgnoreCase))

{

break;

}

}

String[] returnValue =newstring[matchingCount];

if (matchingCount >0)

{

Array.Copy(autoCompleteColors, index, returnValue,0, matchingCount);

}

return returnValue;

}

This method is'nt accessible, it's called from pure javascript in a javascript-source file.

///<summary>

/// Setzt den aktuellen Hersteller (Name)

///</summary>

///<param name="input">Name des Herstellers</param>

[ScriptMethod]

[WebMethod(EnableSession =true)]

publicvoid SetActualManufacturer(string input)

{

SessionData.VehiclePageManufacturer = input;

}

}


Hello Michael,

maybe i'm wrong, but for me is VOID in a webservice a "not so god idee". You get absolut no response from this methode. It's not better to create an object with a returnvalue and react to the returnvalue?

It's only a idee.


The web service code seems OK. I don't know exactly how you're invoking the web service.
As you described, probably you don't have an aspx page with service reference configured using this web service. Adding a service reference to your page, makes AJAX download or include in the web page the proxy code (depending on the parameters you provide).
Check the proxy code that your service generates and see if it helps you (you can check that looking athttp://yourserverver/yourService.asmx/js - you just include /js after your web service address).

HTH,

Maíra

Access custom server classes from Javascript

I am in the process of migrating my VS2005/Atlas app to VS2008/ASP.Net AJAX.

In the old app I could instantiate custom c# classes on the server from within javascript.

An example would be var myObj = new MM.Test();

In the new app this no longer works and throws the 'object expected' exception.

Any ideas what I need to do in order to get this to work?

You have to mark your Webservice/WebMethod with the GenerateScriptType attribute which will include the server side types that you need to create in the client. for the above you have to add the following:

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
[GenerateScriptType(typeof(MM.Test))]
public class MyService
{
.........................
.........................
}


Thanks for that.

Should intellisense sense then work on the members of this class?

Also, my usage is more complex than that. I have a class named Contract that has a generic collection as one of its members. You don't seem to be able to use GenerateScriptType with generic collections so how do I access the collection and its members (specifically the add method.which worked fine using VS2005/Atlas)?

public class Contract
{
public Contract();
public PeriodCollection Periods { get; set; }

}

public class PeriodCollection : Collection<Period>
{
public PeriodCollection();
public string Year { get; set; }
}


I think the intellisens should work if you are working in VS2008.

You do not have to worry about the Collection, it will be convertet to JS Array no matter it is Generic or Regular Collection.

In that case you should add more than one GenerateScriptType in your Web Service or WebMethod.

[GenerateScriptType(typeof(class1))]
[GenerateScriptType(typeof(class2))]
[GenerateScriptType(typeof(class3))]
public class MyService{
}

Hope this will help .and mark it as answer if it solves your issue.