我在创建自托管服务时的首次尝试。尝试创建一些接受查询字符串并返回一些文本但有一些问题的东西:
如果在配置文件中找不到端点,则所有文档都会自动为每个基址自动创建端点。这对我来说似乎不是这样,我得到“服务没有应用程序端点......”的例外情况。手动指定基本端点如下所示似乎解决了这个问题:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Description;
namespace TestService
{
[ServiceContract]
public interface IHelloWorldService
{
[OperationContract]
string SayHello(string name);
}
public class HelloWorldService : IHelloWorldService
{
public string SayHello(string name)
{
return string.Format("Hello, {0}", name);
}
}
class Program
{
static void Main(string[] args)
{
string baseaddr = "http://localhost:8080/HelloWorldService/";
Uri baseAddress = new Uri(baseaddr);
// 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);
host.AddServiceEndpoint(typeof(IHelloWorldService), new BasicHttpBinding(), baseaddr);
host.AddServiceEndpoint(typeof(IHelloWorldService), new BasicHttpBinding(), baseaddr + "SayHello");
//for some reason a default endpoint does not get created here
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();
}
}
}
}
如果需要,我如何设置它以在SayHello(字符串名称)中返回name的值:localhost:8080 / HelloWorldService / SayHello?name = kyle
我在跑步前试图走路,但这似乎只是爬行......
答案 0 :(得分:10)
有关未添加默认端点的问题:
有关What's new in WCF 4 for developers的更多信息,请查看此MSDN库文章。除其他外,它显示了如何使用默认端点 - 您基本上为您的服务定义了一个基地址并打开了ServiceHost - 这就是全部!
string baseaddr = "http://localhost:8080/HelloWorldService/";
Uri baseAddress = new Uri(baseaddr);
// Create the ServiceHost.
using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
{
//for some reason a default endpoint does not get created here
host.Open();
// here, you should now have one endpoint for each contract and binding
}
如果您愿意,还可以在代码中显式添加默认端点。因此,如果您需要添加自己的端点,但是想要添加系统默认端点,则可以使用:
// define and add your own endpoints here
// Create the ServiceHost.
using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
{
// add all the system default endpoints to your host
host.AddDefaultEndpoints();
//for some reason a default endpoint does not get created here
host.Open();
// here, you should now have your own endpoints, plus
// one endpoint for each contract and binding
}
我也fonud this blog post here非常有启发性 - 克里斯托弗的博客充满了非常有用且非常有用的WCF帖子 - 强烈推荐。
答案 1 :(得分:3)
至于书籍 - 这是我的建议:Michele Leroux Bustamante撰写的我总是建议在WCF中快速启动和运行的书是Learning WCF。她涵盖了所有必要的主题,并且以一种非常容易理解和平易近人的方式。这将教会您编写高质量,有用的WCF服务所需的一切 - 基础知识,中间主题,安全性,事务控制等等。
Juval Lowy将Programming WCF Services涵盖更高级的主题以及对WCF的更深入了解。他真正深入研究了所有技术细节和主题,并为WCF编程提供了“圣经”。
答案 2 :(得分:0)
如果IIS托管您的Web服务,那么您将获得友好的“您已创建Web服务”页面,假设没有其他错误。你可能想尝试一些快速的WCF教程,就像在Bustamente的学习WCF书中找到的那样,它们可以快速解释并解释很多。
编辑:Here's an MSDN page显示了一种从您请求的服务调用中获取查询字符串参数的方法,很好的例子。它显示了[WebGet]属性的使用。如果您不想使用它,可以尝试使用OperationContext来获取传入请求的内部。