到目前为止,我已经开发了一个只有一种方法的WCF Web服务,该方法应该从我的postgresql数据库中获取所有“Electeur”数据。我之后应该调用这个web服务,在我的jQuery移动应用程序中使用它并在数据表中显示数据。我在开发webservice时试图学习本教程:http://mikesknowledgebase.azurewebsites.net/pages/Services/WebServices-Page1.htm
当我构建web服务时,一切似乎都很好,但是当我在浏览器中通过导航到http://localhost:20913/Service1.svc/GetElecteurs查看它时,我得到一个空白页面,我不知道什么是错的或者我错过了什么? 我不知道我应该如何在我的jQuery移动客户端应用程序中显示这个获取的数据作为数据表。任何帮助深表感谢!提前谢谢。
PS: 我正在使用Postgresql,这就是为什么我无法在我的代码中使用LINQ,而是将Npgsql.dll复制到我的bin文件夹中文件夹并添加它作为参考,然后我使用npgsql命令连接到我的数据库并获取数据..
这是我的代码:
Service1.svc.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using Npgsql;
using System.Data;
using System.Configuration;
namespace WcfService1
{
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in code, svc and config file together.
public class Service1 : IService1
{
// To use HTTP GET, add [WebGet] attribute. (Default ResponseFormat is WebMessageFormat.Json)
// To create an operation that returns XML,
// add [WebGet(ResponseFormat=WebMessageFormat.Xml)],
// and include the following line in the operation body:
// WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml";
// Add more operations here and mark them with [OperationContract]
// The connexion
NpgsqlConnection cnx = new NpgsqlConnection("Server=localhost;User Id=postgres;Password=*****;Database=electionscasa;");
public List<Electeurs> GetElecteurs()
{
List<Electeurs> ElecteursInscrits = new List<Electeurs>();
{
//Openning the connexion string
cnx.Open();
//Connecting to the database and fetching data : List of all the voters
NpgsqlCommand cmd = new NpgsqlCommand("SELECT cinelecteur, nomelecteur, prenomelecteur, adresseelecteur, professionelecteur FROM electeur", cnx);
cmd.ExecuteNonQuery();
NpgsqlDataAdapter da = new NpgsqlDataAdapter(cmd);
DataTable dt = new DataTable();
//Populating the datatable
da.Fill(dt);
cnx.Close();
}
return ElecteursInscrits;
}
}
}
IService1.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
namespace WcfService1
{
[ServiceContract]
public interface IService1
{
[OperationContract]
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "GetElecteurs")]
List<Electeurs> GetElecteurs();
}
[DataContract]
public class Electeurs
{
string IdElecteur;
string CinElecteur;
string NomElecteur;
string PrenomElecteur;
string AdresseElecteur;
string ProfessionElecteur;
[DataMember]
public string IdElect
{
get { return IdElecteur; }
set { IdElecteur = value; }
}
[DataMember]
public string CinElect
{
get { return CinElecteur; }
set { CinElecteur = value; }
}
[DataMember]
public string NomElect
{
get { return NomElecteur; }
set { NomElecteur = value; }
}
[DataMember]
public string PrenomElect
{
get { return PrenomElecteur; }
set { PrenomElecteur = value; }
}
[DataMember]
public string AdresseElect
{
get { return AdresseElecteur; }
set { AdresseElecteur = value; }
}
[DataMember]
public string ProfessionElect
{
get { return ProfessionElecteur; }
set { ProfessionElecteur = value; }
}
}
}
的web.config
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<!-- We need to add the following <services> tag inside the <serviceModel> -->
<services>
<service name="JSONWebService.Service1">
<endpoint address="../Service1.svc"
binding="webHttpBinding"
contract="JSONWebService.IService1"
behaviorConfiguration="webBehaviour" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="true"/>
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
<!-- //In the <behaviors> tag, we need to add the following <endpointBehaviors> tag-->
<endpointBehaviors>
<behavior name="webBehaviour">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<!-- If we're going to be hosting the web services on a particular domain, but accessing the services from some JavaScript on a different domain,
then we need to make a further change to the web.config file by adding these following lines
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type, Accept" />
</customHeaders>
</httpProtocol>
-->
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
答案 0 :(得分:1)
我设法通过编辑web.config文件来解决问题(服务名称不正确,特别是命名空间,所以我更改了它)并且我还对我的GetElecteurs方法添加了一些更改。
以下是代码:
[WebMethod]
public List<Electeurs> GetElecteurs()
{
List<Electeurs> ElecteursInscrits = new List<Electeurs>();
// The connexion
NpgsqlConnection cnx = new NpgsqlConnection("Server=localhost; Port=5432; User Id=postgres; Password=****; Database=database_name;");
DataTable dt = new DataTable();
Npgsql.NpgsqlDataReader rdr = null;
//Connecting to the database and fetching data
NpgsqlCommand cmd = new NpgsqlCommand("SELECT cinelecteur, nomelecteur, prenomelecteur, adresseelecteur, professionelecteur FROM electeur", cnx);
cnx.Open();
rdr = cmd.ExecuteReader();
dt.Load(rdr);
cnx.Close();
int countRow = dt.Rows.Count;
foreach (DataRow drElect in dt.Rows)
{
Electeurs electeurinscrit = new Electeurs();
//electeurinscrit.IdElect = Convert.ToInt32(drElect["objectid"].ToString());
electeurinscrit.CinElect = drElect["cinelecteur"].ToString();
electeurinscrit.NomElect = drElect["nomelecteur"].ToString();
electeurinscrit.PrenomElect = drElect["prenomelecteur"].ToString();
electeurinscrit.AdresseElect = drElect["adresseelecteur"].ToString();
electeurinscrit.ProfessionElect = drElect["professionelecteur"].ToString();
ElecteursInscrits.Add(electeurinscrit);
}
return ElecteursInscrits;
}