开发 Web 服务期间,存在权限配置不恰当这种情况,通常就会致使服务没办法启动。并且,服务协定所体现的设计这些细节,其状况直接就会对客户端的调用体验产生效应。
public sealed class Book
{
public string BookName { get; set; }
public decimal Price { get; set; }
public string BarCode { get; set; }
}
WebServiceHost类的使用限制
[ServiceContract]
interface IService
{
[OperationContract]
[WebGet(UriTemplate = "getdata?f={format}")]
Message GetXml(string format);
}
运用WebServiceHost类能够使HTTP通信配置得以简化,然而务必要留意权限方面的问题。于Windows系统里,要是打算以并非80的端口来实施HTTP监听,那么便需要具备管理员权限。不然的话,系统将会拒绝访问,进而致使服务启动遭遇失败。
开发者为要防止权限问题,就能够选用利用80端口,或者经由系统配置赋予当前用户权限。还有一种做法则是于启动时申办提升权限,然而这会对用户体验造成影响。在实际开展部署的时候,提议采用IIS当作宿主,如此便能规避权限限制。
服务协定的定义规范
若要定义服务协定,就得用ServiceContract特性去标记接口。要是没指定Name属性,那系统就会默认拿接口名称当作协定名称。此名称在客户端与服务端的通信里起着关键作用。
public class MyService : IService
{
public Message GetXml(string format)
{
WebOperationContext context = WebOperationContext.Current;
Book b = new Book
{
BookName = "卖女孩的小火柴",
Price = 25.2M,
BarCode = "2811365801"
};
Message msgreturn = null;
// 判断格式
if (format.ToLower == "xml")
{
msgreturn = context.CreateXmlResponse(b);
}
else
{
msgreturn = context.CreateJsonResponse(b);
}
return msgreturn;
}
}
协定里的每一个方法,都得明确标记OperationContract特性,不然客户端就没办法调用。此特性能够配置名称、回复动作等参数。合理设置这一些参数,能够对服务的行为予以优化。
服务协定的兼容性
服务协定于服务端及客户端能够运用各异的接口予以定义,只要协定之名相同,且方法的参数以及返回值相互匹配便可。这般灵活性致使双方能够独立进行演进,只要维持契约恒定。
于实际开发期间,提议运用共享的协定程序集,或者借助工具去生成客户端代理,如此能够降低不匹配之灾险。要是的确有必要进行独立定义,那就得确证数据类型以及成员顺序全然相同。
灵活的数据格式返回
利用Message类型产生的返回值呀,能够达成多种数据格式的返回效果呢。于方法内部哟,借助参数能使调用者去指定所需的格式呀,像xml或者json之类的呢。如此这般既满足了不同客户端的需求啦,又维持了接口的统一哟。
于实现之际呢,可以借助WebOperationContext.Current去获取当下的上下文,接着依据格式参数来调用各异的创建响应办法。此种办法虽说拥有灵活性,然而却需要手动去处理序列化方面的逻辑。
static void Main(string[] args)
{
WebServiceHost host = new WebServiceHost(typeof(MyService));
host.Open;
Console.WriteLine("服务已打开。");
Console.Read;
host.Close;
}
WebOperationContext的应用
WebOperationContext类给出了多个CreateXXXResponse办法,是用来创建不一样类型的响应的,像CreateJsonResponse是应对JSON格式的,CreateXmlResponse是针对XML格式的,这些办法会自行处理序列化进程。
当运用这些方法之时,仅需把数据对象传送给泛型方法就行。系统会依据所指定的类型参数达成序列化。此种方式相较于手动序列化更为简洁,并且降低了出现错误的可能性。

服务配置的注意事项
硬编码的方式能够在代码里实现服务基址,配置文件指定的办法也可行。借助配置文件拥有的优势是,在不进行重新编译时,就能够对地址予以修改。这对于不同环境下的部署而言,具备相当有用的性质。
[DataContract(Namespace = "http://sample",Name = "student")]
public sealed class Student
{
[DataMember(Name = "stu_id")]
public int StuID { get; set; }
[DataMember(Name = "stu_name")]
public string StuName { get; set; }
}
运用ServiceHost之际,要对WebHttpBinding以及WebHttpBehavior予以配置。把automaticFormatSelectionEnabled设定成true能够自动处置格式选择,并且会将字符串响应外层的引号去除掉,从而让数据更加整洁。
曾在开发Web服务之际遭遇到哪些权限或者配置层面的此类问题呢,欢迎于评论区域分享相关经验哟,要是觉得这篇文章具备用处的话,请予以点赞给予支持呀!
[ServiceContract]
public interface IData
{
[OperationContract]
[WebGet(UriTemplate = "getdata?f={format}")]
string GetData(string format);
}