WCF / ASMX :: Alternatives To Returning A DataTable From WCF
Dec 7, 2010
I have read a lot of posts describing why it isn't good practice to return heavy objects like DataTable/DataSet to the client from WCF. However, there doesn't seem to be much discussion about the alternatives (or maybe I'm not looking in the right forums).
My problem is this: I've tried to convert my DataReader/DataTable into a List<List<string>>, where List<string> represents the data in each row, but get an error at the point when the data is being sent to the client. A simple List<T> or a one-dimensional array gets returned without any problems. But whenever I try to return a collection of collections, there seems to be an issue. I don't know until runtime what my DataReader would look like as different stored procs are called based on user selection from a web form.
What am I missing here. Is WCF not able to handle collection of collections (I know that multi-dimensional arrays are not supported)?
Would it be better in terms of payload, if I return a datatable as a List<DataRow> from a WCF method? I have WsHtppBinding for my WCF. I am expecting the datatable to contain 5,000 to 10,000 records.
Also, how can I test the difference in payload sizes when returning a DataTable Vs List<DataRow>?
In my web application, I have a dynamic query that returns huge data to datatable and this query is often recalled with different parameters. So database is exhausted. I want to get all record with no parameters to an object, and perform queries (may be with linq) on this object. So database will not be exhausted. Which objects can be used instead of datatable?
I have created alot of stored procedures in my application that return the result of a query in a datatable object. I never use a dataset. Why would I ever use a dataset over simply returning the result of a query as a datatable object?
I'm fairly new to ASP.NET and am working through a tutorial that demonstrates the use of DataAdapter, DataTable, and DataRow classes. The tutorial focuses on binding returned DataTables to GridView objects - I'm having trouble understanding what to do to extract one row for display. I've found I can do the following:
A ProductsTable should be able to return its own ProductRows w/o resorting to a cast, no? Can't find how to do it otherwise. I'm thinking how to go about creating a form where the user will only ever be working on one record at a time. Wouldn't it make sense for the DAL to return a ProductsRow instead of a ProductsTable?
I'm returning one table. My understanding is that a DataSet can be made of more than one DataTable. I also understand that I can use either of these to return my one table.
Is it better to use the DataTable when I have one table to return instead of a DataSet? Is there any advantage of not using the DataSet in a situation like this? Is there a disadvantage to using the DataSet when only one table is being returned? Does this even matter?
I have a simple web method written in the code-behind (not a separate asmx) of a test aspx page.
All it does is return a DataTable(or DataSet) both are failing, gives a blank 500 error saying "There was an error processing the request"
If I switch the return variable type to String, it works fine
I think my issue has to do with the version of the System.Web.Extensions, is that the assembly that actually contains the JSON communication implementation?
I've read all kinds of tutorials about how it should be possible to return the DataTable to javascript and then read the properties with javascript syntax.
For some reason it isn't working for me.
My web extensions is imported through my web.config with the following version
I am trying to use a datasource with a dropdownlist. Eventually, my data source method to call a stored procedure and load the datatable is returns, but for now, I am just creating the datatable manually. I need each item to have two attributes, the text, whixh the user will see in the DDL, and the value that the program will retrieve from and store back to the file.
It is partly working in that the DDL has 3 items, however the text for each item reads "System.Data.DataRowView"
I have to be close, but I can't figure out what I am doing wrong.
I am developing an application with WCF services. The basic functionaloty of a screen is to provide an entry screen to add particular entity. Once save even fired It will save the data to the database and call the bind method to bind into the grid by refreshing the latest data.
When I am running the site from my source (Visual Studio) , it works perfectly. When the client calls method to fetch the data the WCF service, it returns latest (added) data. But the issue comes in the server when it works with IIS. I deployed the code in the server, once the data added I am getting the old data only. But after two refresh I am getting the latest data.
what required to be done to get the latest record.
I am trying to deploy a wcf service. I have created a simple service, basically I have created a new wcf service and tried to deploy it however I get this error
The type 'WCF_Application.Service1', provided as the Service attribute value in the ServiceHost directive, or provided in the configuration element system.serviceModel/serviceHostingEnvironment/serviceActivations could not be found.
I am trying to deploy my service to a subdomain like https://services.mydomain.com/business
Ok so I am trying to setup a WCF web service. I thought I had my .svc and webConfig ready to go, but when I hit this service all I get is a blank page.
I'm using a web service and I want to return a list to my client. I am nearly newby at web services and I can't return a List<String> object to my client. But when i call the method it says "Unable to cast object of type 'System.Collections.Generic.List`1[System.String]' to type 'System.String[]'" What should I do?
I have some WCF services that I want to return in different formats based on a querystring param. For example, [URL], [URL], [URL], etc... This would make it so that many different types of clients could consume the services whichever way was easiest for them, such as binary for a .NET client and json for an ajax or Flex client.
What I'm thinking is that I can have the WCF web methods return their .NET business objects and not worry about the output mode and then have a behavior that hooks in after returning from the web method which checks the querystring for this param and either:
1. Continues returning the business objects if the mode is dotnet.
2. Converts the business objects to xml if the mode is xml and returns a string of xml.
3. Converts the business objects to json if the mode is json and returns a string of json.
I'm trying to communicate with a Windows-hosted SOAP web service using PHP's SoapClient.The Web Service is intended to insert a new record for a member into a database.I can verify that my code using PHP's SOAPClient can successfully transfer the data via the Web Service to the database,but I am not getting the expected return value.
The Web Service description for what I should be getting as a return is described below.On successful execution of the Web Service code,I am getting nothing back despite calling LastResponse function and LastResponseHeaders.It seems no XML is getting returned at all.I am using other API calls within this Web Service and they all seem to work fine with the expected XML returned whenever I invoke a method.but for this one,which involves sending data,I'm not getting a return
I've been reading quite a few tutorials on web services and xml files and one thing isn't quite clear to me. If I want to create an XML file on the fly the tutorials are pretty straight forward but, I want to grab an existing XML file from the web server and return the whole thing. Do I need to read the XML file and send each individual node or is there a way to send the file all at once? The tutorials imply that the whole file could be a node but I'm not clear on what that entails or if it would work. Also do you have a link to an example?
I Need by service contract to return the xml/json result depending on the request type. function which will convert my result set (i am using linq to sql) so that i do not need to create the xml format for the result set by iterating through the table row many times.What is the suitable way to do that.
I need a kind of short cut method which will convert the table data to xml result.Had i been using asp.net mvc i would have been able to generate the xml data by overriding the the ExecuteResult method in the ActionResult and giving Conetnt-Type = "text/xml" as OP.But since i am using Wcf i don't have the controller context(as controller context is the parameter that needs to be passed to Execute Result).
My present code for converting the table data to the xml format is below.
public XDocument UsersLists(string authToken) { bool IsAuthenticated = Authenticate(authToken); XDocument xDoc = new XDocument(); XElement root = new XElement("Users");
[Code]....
I need to eliminate this way of generating xml for each table records.
I have a web service that is running and it shows a list of employees with their information. I created the web service with the following code:
[Code]....
The problem is 'Null' values in the datatable don't show up as empty tags in the XML so when I read the XML from the web service this is no consistency. Is there a way to show the tags even when the fields are null in the datatable or is there a better way to accomplish what I need. I'm reading this web service from a silverlight application with the following code (this application works but, it doesn't show all the employees as it skips over when no tag is present):
I can fill and then return typed dataset from a web method, but applying these steps by using Typed Datatable instead of Typed Dataset I cannot return filled typed dataTable. So, is it possible to return typed dataTable from a web method? If yes, how can I do this?
I shall give a little bit information about my project. There is 3 project in my solution. I) Presentation Layer (WinForm), II) Business Layer (Web Service) , III) Data Access Layer (Win form project type)... The problem is that;
I use 2 seperate methods. 1st is FillTable() which fill a datatable in my Typed Dataset in Data Access layer. The 2nd isGetTable() which should return typed datatable filled by FillTable() method. I try these methods and FillTable() methods (goes from I. layer to II. Layer and then III. layer) fills a datatable properly and after that I can return this datatable by calling GetTable() method from Typed Dataset (in III. layer) to WebService. I have tested the rows count of returning datatable and there is no problem up to WebService. But even after returning this typed datatable from WebService the table comes to Presentation Layer empty. So, there is a problem returning filled typed datatable from WebService to WebForm (from II. layer to I. layer).
On the other hand, if I try this methods by returning Typed Dataset instead of Typed Datatable, I can return properly with a filled datatable in Typed Dataset. But, I relly do not want to return a huge filled dataset which may contain 15 tables instead of one datatable. My questions;
1) Is there any logical approach mistake on my Layer Architecture?
2) What should I do in order to get a Typed Datatable from Web Service (II. Layer of my project)?
I am trying to send System.Data.Datatable from a WCF service, to a C# Windows Forms application. When I execute, I get follwowing message:The maximum message size quota for incoming messages (65536) has been exceededThe datatable I am trying to send can get quite large. What would be the best approach to send the DataTable across without hitting message size limit, or in other words, what are ways around this problem?