调用WebService时出现“System.InvalidOperationException: Unable to generate a temporary class”错误的解决

本文介绍了一种在调用WebService过程中遇到的异常问题及其解决方案。异常表现为找不到源文件,实际原因是ASP.NET运行账户缺少对临时文件夹的写入权限。通过为该账户添加必要的权限,问题得以解决。
今天调用WebService是出现以下异常:
System.InvalidOperationException: Unable to generate a temporary class
(result=1). error CS2001: Source file 'C:/WINNT/TEMP/gggcyckb.0.cs' could not
be found error CS2008: No inputs specified at
System.Xml.Serialization.Compiler.Compile() at
System.Xml.Serialization.TempAssembly..ctor(XmlMapping[] xmlMappings) at
System.Xml.Serialization.XmlSerializer.FromMappings(XmlMapping[] mappings) at
System.Web.Services.Protocols.SoapClientType..ctor(Type type) at
System.Web.Services.Protocols.SoapHttpClientProtocol..ctor() at
SDAccounts.swd_dotnetdev.Organizations..ctor() at
SDAccounts.Contacts.GetContactInfo(Object Status, Object& ErrorString)
 表明看起来是无法找到源文件,实际上是asp.net的运行帐户对Windows/temp/目录没有写入的权限,加入权限后问题解决
### 解决 SoapException 和 InvalidOperationException 异常的方案 在使用 `System.Data.OracleClient` ,如果出现 `System.Web.Services.Protocols.SoapException` 或 `System.InvalidOperationException` 异常,并且提示 `ConnectionString` 未初始化,通常是因为以下几个原因导致:数据库连接配置不正确、缺少必要的权限或依赖库、或者 WebService 配置文件中的设置有误。 #### 1. 检查 ConnectionString 的配置 确保在应用程序的配置文件(如 `web.config` 或 `app.config`)中正确设置了 `ConnectionString`。以下是一个典型的 Oracle 数据库连接字符串示例[^4]: ```xml <connectionStrings> <add name="OracleConnectionString" connectionString="Data Source=ORCL;User Id=myUsername;Password=myPassword;" providerName="System.Data.OracleClient"/> </connectionStrings> ``` 在代码中访问该连接字符串,应确保正确引用了配置文件中的键值: ```csharp using System.Configuration; using System.Data.OracleClient; string connectionString = ConfigurationManager.ConnectionStrings["OracleConnectionString"].ConnectionString; using (OracleConnection connection = new OracleConnection(connectionString)) { connection.Open(); // 执行查询或其他操作 } ``` #### 2. 确保 Oracle 客户端已正确安装 `System.Data.OracleClient` 是 .NET Framework 中的一个遗留组件,需要确保系统上安装了正确的 Oracle 客户端版本。如果客户端未正确安装,可能会导致运行异常。建议验证以下几点: - 确认目标机器上安装了与应用程序兼容的 Oracle 客户端。 - 如果使用的是 64 位操作系统,确保安装了 64 位版本的 Oracle 客户端,反之亦然。 #### 3. 处理 SoapException 的常见原因 SoapException 通常发生在 SOAP 协议通信失败。根据提供的引用信息[^1],错误可能由以下原因引起: - SOAP 请求头中的 `SOAPAction` 值不被服务器识别。 - WebService 方法签名与客户端调用不匹配。 解决方法包括: - 确保客户端发送的 SOAP 请求头正确设置 `SOAPAction` 属性。例如,在 WCF 或 ASP.NET WebService 中,可以显式指定 `SoapDocumentMethod` 属性: ```csharp [WebMethod] [SoapDocumentMethod(Action = "urn:MyCustomAction", RequestNamespace = "http://example.com", ResponseNamespace = "http://example.com")] public string MyWebServiceMethod() { return "Success"; } ``` - 如果问题仍然存在,可以通过启用 WCF 或 ASP.NET 的跟踪日志来捕获详细的错误信息[^5]。 #### 4. InvalidOperationException 的处理 当遇到 `InvalidOperationException` 并提示 `ConnectionString` 未初始化,通常是因为以下原因之一: - `ConnectionString` 在代码中未正确赋值。 - 使用了未实例化的 `OracleConnection` 对象。 解决方案如下: - 确保在创建 `OracleConnection` 实例之前,已经为 `ConnectionString` 赋值。 - 检查是否有多个线程同访问同一连接对象,这可能导致资源冲突。 示例代码: ```csharp using System.Data.OracleClient; string connectionString = "Data Source=ORCL;User Id=myUsername;Password=myPassword;"; try { using (OracleConnection connection = new OracleConnection(connectionString)) { connection.Open(); Console.WriteLine("Connection successful!"); } } catch (InvalidOperationException ex) { Console.WriteLine($"Invalid operation exception: {ex.Message}"); } catch (Exception ex) { Console.WriteLine($"General exception: {ex.Message}"); } ``` #### 5. 检查磁盘空间和临文件 根据引用信息[^3],删除临文件后可能导致某些系统文件丢失或损坏,从而引发异常。建议执行以下步骤: - 检查系统日志以确认是否有任何文件丢失的记录。 - 重新安装或修复 Oracle 客户端及相关的依赖项。 - 确保有足够的磁盘空间以避免类似问题再次发生。 --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值