Web服务中的异常处理(2)

Web服务的实现
为了达到这个示例的目的,我们创建一个名为CategoriesService的Web服务,选择一个可视化的C#ASP.NETWeb服务作为项目的模版。一旦创建项目,我们就添加一个名为AddCategories的方法,并且给这个方法添加下列代码:

[WebMethod]

publicboolAddCategories(stringxml)

{

try

{

using(SqlConnectionconn=newSqlConnection())

{

if(ValidateXml(xml))

{

XmlDocumentdoc=newXmlDocument();

doc.LoadXml(xml);

conn.ConnectionString=

"server=localhost;uid=sa;pwd=thiru;database=northwind";

conn.Open();

XmlNamespaceManagernsManager=new

XmlNamespaceManager(doc.NameTable);

//AddthenamespacetotheNamespaceManager

nsManager.AddNamespace("catNS",

"http://tempuri.org/CategoriesNamespace");

XmlNodecategoryNode=

doc.DocumentElement.SelectSingleNode("catNS:Category",

nsManager);

stringcategoryName=

categoryNode.SelectSingleNode("catNS:CategoryName",

nsManager).InnerText;

stringcategoryDescription=

categoryNode.SelectSingleNode("catNS:CategoryDescription",

nsManager).InnerText;

SqlCommandcommand=new

SqlCommand("usp_InsertCategories",conn);

command.CommandType=CommandType.StoredProcedure;
//AddtheCategoryNameparameter

SqlParameterparamCategoryName=new

SqlParameter("@CategoryName",SqlDbType.NVarChar,15);

paramCategoryName.Direction=ParameterDirection.Input;

paramCategoryName.Value=categoryName;

command.Parameters.Add(paramCategoryName);

//AddtheDescriptionparameter

SqlParameterparamDescription=new

SqlParameter("@Description",SqlDbType.Text);

paramDescription.Direction=ParameterDirection.Input;

paramDescription.Value=categoryDescription;

command.Parameters.Add(paramDescription);
command.ExecuteNonQuery();

}

else

throw

RaiseException("AddCategories",

"http://tempuri.org/CategoriesService",

builder.ToString(),

"2000","AddCategories",FaultCode.Client);

}

returntrue;

}

catch(SoapExceptionsoapEx)

{

throwsoapEx;

}

catch(Exceptionex)

{

EventLog.WriteEntry("Test",ex.Message);

throw

RaiseException("AddCategories",

"http://tempuri.org/CategoriesService",ex.Message,

"1000",ex.Source,FaultCode.Server);

}

}
正如其名所提示的那样,AddCategories方法负责把category的详细信息添加到Northwind数据库的categories表中。在执行添加操作之前,AddCategories方法使用一个外部的XML模式文件校验被添加的XML数据,如果校验失败,它给Web服务的客户端抛出一个异常。

让我们来大致浏览上面的代码吧。首先,把XML数据传递给它,调用ValidateXml方法。过一会我们再来看ValidateXml方法的代码。ValidateXml方法返回true或false,这完全取决于XML校验是否成功。如果返回true,那么就创建一个XmlDocument对象实例,并给它导入XML数据,另外还设置ConnectionString属性来初始化SqlConnection对象,然后调用SqlConnection对象的Open方法。其次,创建一个XmlNamespaceManager实例,调用AddNamespace方法关联一个命名空间。一旦关联命名空间,我们就可以使用命名空间标识符引用正确的XML元素。再次,创建一个SqlParameter对象实例,给存储过程添加参数。最后,调用SqlCommand对象的ExecuteNonQuery方法执行存储过程。

如果ValidateXml方法返回false,则用名为RaiseException的助手方法抛出SoapException。我们现在就来讨论RaiseException。RaiseException方法一个基本的助手方法,它封装用来从Web服务中抛出异常的代码。RaiseException方法的最后一个参数是一个枚举常量,它的定义如下。

publicenumFaultCode

{

Client=0,

Server=1

}

XML校验失败表示客户端提供了无效的XML数据。这种情况,我们应该把枚举常量设为Client,给客户应用程序指出这种错误。这就使得我们通知客户端应用程序在再一次调用Web服务之前需要检查输入数据的格式成为可能。如果Web服务由于一些其他原因(例如,数据库服务器的不可用)而失败,那么就需要设置枚举常量为Server。这就说明Web服务失败是由于服务器端的一些问题造成的,客户应用程序可以在几秒钟后重新请求。事实上,在catch块中捕捉一般Exception,这正是我们要做的。 (出处:PConline)

(0)

相关推荐

  • Web服务中的异常处理(4)

    客户端的异常处理 这个部分,我们将看看在客户端怎样处理从Web服务中所抛出的异常.为了说明这个做法,我们来创建一个新项目CategoriesServiceClient.一旦项目被创建,就在默认的表单上添加一个命令按钮,并命名为btnInvoke.因为需要在客户端引用Web服务,所以在项目CategoriesService中添加一个WebReference.可以通过Project->AddReference菜单选项来完成添加.然后修改命令按钮的Click事件,如下所示. privatevoidbt

  • Web服务中的异常处理(2)

    Web服务的实现 为了达到这个示例的目的,我们创建一个名为CategoriesService的Web服务,选择一个可视化的C#ASP.NETWeb服务作为项目的模版.一旦创建项目,我们就添加一个名为AddCategories的方法,并且给这个方法添加下列代码: [WebMethod] publicboolAddCategories(stringxml) { try { using(SqlConnectionconn=newSqlConnection()) { if(ValidateXml(xml

  • 在Rust web服务中使用Redis的方法

    Redis一直是网络生态系统的重要组成部分,它经常用作缓存.消息代理或简单地用作数据存储. 在这篇文章中,我们将演示如何在一个Rust web应用程序中使用Redis. 我们将探索两种种使用Redis的方法: 使用同步连接池 使用异步连接池 对于同步池,我们使用基于r2d2库的r2d2-redis.我们在异步解决方案中使用mobc,还有许多其他异步连接池,如deadpool和bb8,它们都以类似的方式工作. 话不多说,让我们开始吧! 新建一个项目: cargo new rust-redis-we

  • ASP.NET如何使用web服务的会话状态

    在web服务中要用到ASP.NET中的会话对象,有2件事情需要做. 1.WebService 类需要继承System.Web.Services.WebService类 2.WebMethod中的EnableSession属性值应该设置为true 来看我们CalculatorWebService类,我们可以看到,它已经继承System.Web.Services.WebService类.但是,我们需要EnableSession属性值设置为true. 本文中,我们将试试在使用一个如下所示的GridVi

  • JQuery中ajax方法访问web服务实例

    本文实例讲述了JQuery中ajax方法访问web服务.分享给大家供大家参考.具体分析如下: 说明: ArrayList 中 存为对象CollegeDepartInfo 其属性为:stirng CollegeDepartTitle 和 int CollegeDepartId 在javascript中 ddlDepart.options[ddlDepart.length]=new Option(n.CollegeDepartTitle,n.CollegeDepartId); Option的参数就是

  • 在 ASP.NET Core 中为 gRPC 服务添加全局异常处理

    目录 一.咨询区 Dmitriy 二.回答区 valentasm 三.点评区 以下文章来源于公众号:DotNetCore实战 一.咨询区 Dmitriy 在 ASP.NET Core 中使用GRPC.ASPNETCore 工具包写 gRPC 服务,想实现 gRPC 的异常全局拦截, 代码如下: app.UseExceptionHandler(configure => {     configure.Run(async e =>     {         Console.WriteLine(&

  • 手把手教你在.NET中创建Web服务实现方法

    最近发现在.NET平台下使用Web服务还是很简单的.下面举个在.NET平台下创建Web服务的简单例子.首先用Visul Studio .Net创建一个C# 项目Asp.Net Web服务程序,源代码如下: 复制代码 代码如下: using System;using System.Collections;using System.ComponentModel;using System.Data;using System.Diagnostics;using System.Web;using Syst

  • 如何用C写一个web服务器之基础功能

    服务器架构 目标架构 以 nginx 的思想来考虑本服务器架构,初步考虑如下图: 当然 php 进程也可以替换为其他的脚本语言,可以更改源码中的 command 变量实现. 服务器有一个 master 进程,其有多个子进程为 worker 进程,master 进程受理客户端的请求,然后分发给 worker 进程,worker 进程处理 http 头信息后将参数传递给 php 进程处理后,将结果返回到上层,再响应给客户端. 也考虑过使用 php-fpm 的 worker 进程池方式,那样的话 ph

  • 利用docker搭建web服务环境的方法步骤

    前言 做过开发的人对开发环境的安装.配置应该都不会太陌生,不管你做什么开发,对开发环境都会具有一定的依赖性的.对于 PHP 的 Web 开发来说,开发环境至少要有一个 Web 服务器(如 Apache.Nginx).一个数据库服务器(如 MySQL)和一个 PHP 解析器吧,如果你的 PHP 代码使用的一些扩展,那你还需要给你的 PHP 安装上这些扩展,那样你的 PHP 代码才能够顺利地跑起来.对于一个只想静静地敲代码的开发人员来说,开发环境的安装与配置这种事情,只要经历一次就已经很折腾人了.可

  • 为何XML对Web服务很重要

    Web服务经常从它的组件技术的角度来进行描述.SOAP.UDDI.WSDL.XML以及HTTP各自组成了Web服务体系的一部分,它们都发挥了重要作用.让我们看看XML技术对Web服务平台的贡献. 标准化 与其它Web服务技术相比,标准化是XML特色之一.XML提供了Web服务应用程序之间传输数据的标准格式.万维网联盟(W3C)管理XML标准并发布给全球的XML技术提供者,这就确保了XML产品的兼容性. 除了XML引擎和产品外还有XML文法(grammar).每一个XML语法都是一种在某个特定问题

随机推荐