C# 如何从asp.net客户端调用自主机wcf服务?
我有一个自己托管WCF服务的控制台应用程序。当用户访问asp.net应用程序并单击页面上的按钮时,如何编写脚本以将此自托管WCF服务称为本地托管的服务。我想我的剧本有问题,请帮忙C# 如何从asp.net客户端调用自主机wcf服务?,c#,jquery,wcf,console-application,C#,Jquery,Wcf,Console Application,我有一个自己托管WCF服务的控制台应用程序。当用户访问asp.net应用程序并单击页面上的按钮时,如何编写脚本以将此自托管WCF服务称为本地托管的服务。我想我的剧本有问题,请帮忙 namespace SelfHost { [ServiceContract] public interface IHelloWorldService { [OperationContract] string SayHello(string name); } [AspNetC
namespace SelfHost
{
[ServiceContract]
public interface IHelloWorldService
{
[OperationContract]
string SayHello(string name);
}
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class HelloWorldService : IHelloWorldService
{
public string SayHello(string name)
{
return string.Format("Hello, {0}", name);
}
}
class Program
{
static void Main(string[] args)
{
Uri baseAddress = new Uri("http://127.0.0.1/hello");
// Create the ServiceHost.
using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
{
// Enable metadata publishing.
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
host.Description.Behaviors.Add(smb);
// Open the ServiceHost to start listening for messages. Since
// no endpoints are explicitly configured, the runtime will create
// one endpoint per base address for each service contract implemented
// by the service.
host.Open();
Console.WriteLine("The service is ready at {0}", baseAddress);
Console.WriteLine("Press <Enter> to stop the service.");
Console.ReadLine();
// Close the ServiceHost.
host.Close();
}
}
}
调用服务的脚本
<script type="text/javascript">
function invokeService() {
$(document).ready(function () {
var userName = " test";
$.ajax({
type: "POST",
async: "false",
url: "http://127.0.0.1:8080/hello",
data: "{'name':'" + userName + "'}",
contentType: "application/json; charset=utf-8",
dataType: "json",
processData: true,
method: "SayHello",
success: function (result) {
AjaxSucceeded(result);
},
error: function (retult) {
AjaxFailed(result);
}
});
});
}
不要希望以这种方式使用jquery调用WCF服务 最大的问题是您正在公开一个Soap服务,并试图使用一个类似rest的客户端来调用它 自.NET3.5以来,WCF允许您向非SOAP端点公开WCF服务操作。您必须以这种方式公开您的服务,才能使用Jquery来使用它 MSDN ie的起点,几年前有一个很好的介绍 一个非常简单的例子是没有任何配置
[ServiceContract]
public interface IService
{
[OperationContract]
[WebGet(BodyStyle=WebMessageBodyStyle.Bare, RequestFormat=WebMessageFormat.Json, ResponseFormat=WebMessageFormat.Json)]
string EchoWithGet(string s);
[OperationContract]
[WebInvoke(BodyStyle=WebMessageBodyStyle.Bare, RequestFormat=WebMessageFormat.Json, ResponseFormat=WebMessageFormat.Json)]
string EchoWithPost(string s);
}
public class Service : IService
{
public string EchoWithGet(string s)
{
return "You said " + s;
}
public string EchoWithPost(string s)
{
return "You said " + s;
}
}
class Program
{
static void Main(string[] args)
{
WebServiceHost host = new WebServiceHost(typeof(Service), new Uri("http://localhost:8000/"));
ServiceEndpoint ep = host.AddServiceEndpoint(typeof(IService), new WebHttpBinding(), "");
ServiceDebugBehavior sdb = host.Description.Behaviors.Find<ServiceDebugBehavior>();
sdb.HttpHelpPageEnabled = false;
host.Open();
Console.WriteLine("Service is running");
Console.WriteLine("Press enter to quit...");
Console.ReadLine();
host.Close();
}
}
刚刚发现不允许通过脚本进行跨域调用。所以另一种方法是使用命令行应用程序或控制台文件来调用wcf服务。然后在注册表中注册此应用程序。然后从脚本启动应用程序。我们需要查看您的自托管服务的配置文件!所有有趣的东西,比如绑定和行为,都是在这里配置的——如果没有这些,我们就无能为力,真的。。。但是调用自托管WCF服务与调用IIS托管的WCF服务没有什么不同,真的-只要获得正确的WCF地址、绑定和合同的ABC,您就可以开始了!当您尝试调用该服务时,控制台应用程序是否正在运行?从WCF服务可以看出,您正在使用BasicHttpBinding公开SOAP服务。如果您想从JQuery/Ajax调用您的服务,而不是在JQuery/Ajax中构建完整的SOAP消息,那么最好使用chrome提供的WebHttpBindingDebug公开WCF服务,因为在本地脚本上调用自托管服务似乎是跨域的,我将尝试解决这个问题。