我们在某个服务器上有一个数据库:database1.mdf位于http://someserver.com。
我们需要使用控制台自动托管来构建一个WCF服务(在C#上),该服务将连接到该远程数据库并提供一些功能,例如:读取记录,插入新记录,执行“选择”查询等。
最后,我们需要编写将与该WCF服务进行通信的客户端页面(在JavaScript上),并向客户端提供信息。
我是这个问题的新手,已经发现了很多信息,但是使用了很多不同的技术,框架,参考资料等,一切似乎都太复杂了。我想要一个非常基本但强大的解决方案,可以是完成必要的MVS工具。所以任何帮助都会受到赞赏。
这就是我已经完成的事情:
可以从URL访问数据库:http://someserver.com/database1.mdf例如,'someserver'可以是localhost。
我使用控制台自动托管构建了一个基本的WCF服务。该计划如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.Data.SqlClient;
using System.Data;
namespace hostWCF
{
class Program
{
static void Main(string[] args)
{
ServiceHost myServiceHost = null;
try
{
Uri httpBaseAddress = new Uri("http://localhost:4321/myService");
myServiceHost = new ServiceHost(typeof(myService.myService), httpBaseAddress);
myServiceHost.AddServiceEndpoint(typeof(myService.ImyService), new WSHttpBinding(), "");
ServiceMetadataBehavior serviceBehavior = new ServiceMetadataBehavior();
serviceBehavior.HttpGetEnabled = true;
myServiceHost.Description.Behaviors.Add(serviceBehavior);
myServiceHost.Open();
Console.WriteLine("myService was launched at: {0}", httpBaseAddress);
Console.WriteLine();
// DO WE NEED TO MAKE A CONNECTION WITH DATABASE HERE?
Console.ReadKey();
}
catch (Exception ex)
{
myServiceHost = null;
Console.WriteLine("myService has faced a problem: " + ex.Message);
Console.ReadKey();
}
}
}
}
启动服务后如何连接到远程数据库?或者通过将连接过程放入ImyService [OperationContract]来制作像服务函数这样的连接过程更好吗? Maby最好不要及时保持连接,但只有在客户端与数据库通信时才打开它?那么,如何提供将对数据库执行查询的方法?最后,如何编写一个代理类,将JSON格式的数据发送到客户端页面?
http://www.topwcftutorials.net/2015/04/create-wcf-data-service.html
http://www.c-sharpcorner.com/UploadFile/rohatash/inserting-data-into-database-using-wcf-service/
我发现两个教程非常有用(第一个数据库方法和第二个数据库方法),但我不想使用ASP.NET Web应用程序(如第一个)。所以我想知道如何将基于* .svc的WFC数据服务添加到解决方案中,就像第二个一样。可以使用代码向主机添加服务引用(因为只有在主机运行时才能找到服务。 。),MVS'添加服务参考......'看不到它。
更新:
我走了一步。现在,我的WCF控制台宿主应用程序看起来非常简单,只有本地数据库。
using System;
using System.ServiceModel;
using System.Data;
using System.Data.SqlClient;
namespace demoWCFHost
{
public class Program
{
public static void Main()
{
BasicHttpBinding binding = new BasicHttpBinding();
binding.Name = "binding1";
Uri baseAddress = new Uri(@"http://localhost:8000/service1");
ServiceHost serviceHost = new ServiceHost(typeof(Service1), baseAddress);
serviceHost.AddServiceEndpoint(typeof(IService1), binding, baseAddress);
serviceHost.Open();
Console.WriteLine("The service is ready.");
Console.WriteLine("Press <ENTER> to terminate service.");
Console.WriteLine();
Console.ReadLine();
serviceHost.Close();
}
}
[ServiceContract]
public interface IService1
{
[OperationContract]
string DoWork();
}
[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class Service1 : IService1
{
public string DoWork()
{
Console.WriteLine("DoWork() method was called");
string connectionString = @"data source=(LocalDB)\v11.0;attachdbfilename=|DataDirectory|\database1.mdf;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
Console.WriteLine("database is connected");
Console.WriteLine();
string response = String.Empty;
using (SqlCommand command = new SqlCommand("SELECT * FROM table", connection))
{
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
for (int i = 0; i < reader.FieldCount; i++)
{
response += reader.GetValue(i);
}
}
}
}
connection.Close();
Console.WriteLine("database is disconnected");
Console.WriteLine();
return response;
}
}
}
}
它处理一个DoWork()方法,它返回数据库中的所有记录。 现在我试图从JavaScript页面调用它:
<html>
<head>
<script language="javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>
</head>
<body>
<div id="results"></div>
<script language="javascript">
$(
function () {
$.ajax( {
type: 'POST',
url: 'http://localhost:8000/service1',
data: '<'+'soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">'+
'<'+'soap:Body>'+
'<'+'DoWork xmlns="http://tempuri.org/">'+
'<'+'/DoWork>'+
'<'+'/soap:Body>'+
'<'+'/soap:Envelope>',
success: function (data, textStatus, xhr) {
$('#results').html(escape(xhr.responseText));
},
dataType: 'xml'
});
});
</script>
</body>
</html>
但它落在:
POST http://localhost:8000/service1 jquery.min.js:140
ajax @ jquery.min.js:140
(anonymous function) @ (index):52
ready @ jquery.min.js:28
t @ jquery.min.js:36
(index):1
XMLHttpRequest cannot load http://localhost:8000/service1. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not allowed access. The response had HTTP status code 415.
有关如何修复的任何想法?此外,我们仍然需要使数据库连接远程而不是本地...