我的第一个web service程序(原创)

程序功能:为联想渠道备件管理系统(SDM)提供上传和查看SLA附件,SDM系统服务器在一台机器上,要求附件保存在另一个文件系统服务器上.
程序运行背景:
本机(10.99.58.101)的默认网站(即localhost)主目录:D:\项目\SDM\01 工程\03 编码\SPMBJ\SPM
web service所在主机(10.99.58.108)(10.99.29.162)的默认网站(即localhost)主目录:C:\Inetpub\wwwroot
我所创建的web service程序文件夹命名(别名)为SpmSLAWebSevice

Code
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.UI;
using System.Web.Services;
using System.IO;
using System.Web.Services.Protocols;


namespace SpmSLAWebSevice
{
    [SoapDocumentService(RoutingStyle
=SoapServiceRoutingStyle.RequestElement)]
    
/**//// <summary>
    
/// GetBinaryFile 的摘要说明。
    
/// Web Services名称:GetBinaryFile
    
/// 功能:返回服务器上的一个文件对象的二进制字节数组。
    
/// </summary>

    [WebService(Namespace="http://LenovoUploadAndGetSLA/SpmSLAWebSevice/",
         Description
="在Web Services里利用.NET框架进行传递二进制文件。")]
    
    
public class SpmSLA : System.Web.Services.WebService
    
{

        
Component Designer generated code#region Component Designer generated code
        
//Web 服务设计器所必需的
        private IContainer components = null;

        
/**//// <summary>
        
/// 清理所有正在使用的资源。
        
/// </summary>

        protected override void Dispose( bool disposing )
        
{
            
if(disposing && components != null)
            
{
                components.Dispose();
            }

            
base.Dispose(disposing);
        }


        
#endregion


        
        [WebMethod(Description
="从服务器获得文件。")][SoapDocumentMethod(Action="")] 
        
public byte[] GetImage(string FilePathNonRoot)
        
{
            
/**////FilePathNonRoot参数据包含相对路径和文件名
            
///得到服务器端的一个图片
            
///如果你自己测试,注意修改下面的实际物理路径

                if(FilePathNonRoot == null || FilePathNonRoot == "")
                    
return getBinaryFile("D:\\Picture.JPG");
                
else
                
{
                    
string path = System.Configuration.ConfigurationSettings.AppSettings["UploadDirectory"]+FilePathNonRoot;
                    
return getBinaryFile(Server.MapPath(path) );
                }

        }


        
/**//// <summary>
        
/// getBinaryFile:返回所给文件路径的字节数组。
        
/// </summary>
        
/// <param name="filename"></param>
        
/// <returns></returns>

        public byte[] getBinaryFile(string filename)
        
{
            
if(File.Exists(filename))
            
{
                
try
                
{
                    
/**////打开现有文件以进行读取。
                    FileStream s = File.OpenRead(filename);
                    
return ConvertStreamToByteBuffer(s);
                }

                
catch(Exception e)
                
{
                    
return new byte[0];
                }

            }

            
else
                
            
{
                
return new byte[0];
            }

        }

        
/**//// <summary>
        
/// ConvertStreamToByteBuffer:把给定的文件流转换为二进制字节数组。
        
/// </summary>
        
/// <param name="theStream"></param>
        
/// <returns></returns>

        public byte[] ConvertStreamToByteBuffer(System.IO.Stream theStream)
        
{
            
int b1;
            System.IO.MemoryStream tempStream 
= new System.IO.MemoryStream();
            
while((b1=theStream.ReadByte())!=-1)
            
{
                tempStream.WriteByte(((
byte)b1));
            }

            
return tempStream.ToArray();
        }


    

    
    
        [WebMethod(Description
="SLA文件上载。")][SoapDocumentMethod(Action="")] 
        
public string UploadFile(byte[] fs,string PathNonRoot,string FileName)
        
{
            
try
            
{            
                
string path = System.Configuration.ConfigurationSettings.AppSettings["UploadDirectory"]+PathNonRoot;
                
//创建目录名字
                if(!Directory.Exists(Server.MapPath(path)))
                
{
                    Directory.CreateDirectory(Server.MapPath(path));
                }

                
/**////定义并实例化一个内存流,以存放提交上来的字节数组。
                MemoryStream m = new MemoryStream(fs);
                
/**////定义实际文件对象,保存上载的文件。
                FileStream f = new FileStream(Server.MapPath(path) + FileName, FileMode.Create);
                
/**////把内内存里的数据写入物理文件
                m.WriteTo(f);
                m.Close();
                f.Close();
                f 
= null;
                m 
= null;
                
return "文件已经上传成功。";
            }

            
catch(SoapException  e)
            
{
                
return e.Actor+"    "+e.Code+"     "+e.Detail+"     "+e.Message;
            }

            
catch(Exception ex)
            
{
                
return ex.Message;
            }

        }

        
    }

}
 

webservice运行成功后,显示在浏览器中的网址为:http://localhost/SpmSLAWebSevice/SpmSlaFile.asmx
遇到的问题:
一.web service创建程序和调用程序均在本机
1.服务器未能识别 HTTP 标头 SOAPAction 的值:http://localhost/SpmSLAWebSevice/UploadFile
错误源:WebSevice的属性Namespace从[WebService(Namespace=http://localhost/SpmSLAWebSevice/)]修改为[WebService(Namespace=http://10.99.58.101/SpmSLAWebSevice/)]
解决办法:增加[SoapDocumentService(RoutingStyle=SoapServiceRoutingStyle.RequestElement)]

二.web service创建程序在远程服务器上,调用程序在本机
1.
对“c:\inetpub\wwwroot\SpmSLAWebSevice\”的访问被拒绝。未能开始监视文件更改
解决办法: 在10.99.58.108的c:\inetpub\wwwroot\目录下的SpmSLAWebSevice文件夹上点右键-> 共享和安全->添加 ->ASPNET( 作为用户名)
2.请求因 HTTP 状态 401 失败:Access Denied
解决办法:远程调用时将10.99.58.108上默认网站下的SpmSLAWebSevice站点属性配置“允许匿名访问”勾上
3.请求因 HTTP 状态 401 失败:Unauthorized
解决办法:在调用程序中  
  WebReference.SpmSLA o;
     o = new SPM.WebReference.SpmSLA();
     o.Credentials=System.Net.CredentialCache.DefaultCredentials; //用于身份验证
4.对路径c:\inetpub\wwwroot\SpmSLAWebSevice\EW00212220-2008115162728-2.jpg的访问被拒绝
解决办法:将10.99.58.108上SpmSLAWebSevice文件夹安全属性新添加的ASPNET用户权限配置的"修改"勾上.
三.web service在服务器(10.99.29.162)上,调用程序在本机(10.99.58.101),两服务器不在一个网段
1.
System.Web.Services.Protocols.SoapException: 无法识别请求元素
错误源:动态引用WebReference。将WebReference的属性中URL行为由默认值"静态"修改成"动态"后,程序自动在web.config文件中添加:
<add key="SPM.WebReference.SpmSLA" value="http://10.99.29.162/SpmSLAWebSevice/SpmSlaFile.asmx"/></appSettings>
起初我以为这是自己何时手动加的,我把SPM.WebReference.SpmSLA修改成了SPM.WebReference.SpmSLAWebSevice,后来发现这是错的,那条语句是程序自己写上的,SpmSLA是我写的webservice程序中所建类的类名.
动态引用的目的是方便当webservice布置到网络中任意一个位置,客户端不用修改程序并重新加载和编译,而只需修改客户端程序的web.config文件中的相应配置.
我起初实现动态引用的办法:将webservice程序布置到不同位置时都让开发人员将该程序打开,如修改[WebService(Namespace=http://10.99.58.101/SpmSLAWebSevice/)]
为[WebService(Namespace="http://10.99.29.162/SpmSLAWebSevice/")],然后我再修改客户端调用程序的config文件.导致报上述错误.(起先并不知道是这里导致上述错误,查错查了很长时间,不知道问题出在哪)

解决办法:(懒得写了,就直接引述我作为客户端对web服务所在机器人员的飞鸽传书内容吧)
>>你什么也不修改,不修改命名空间的IP, 也不重新编译SPM程序,我来再访问一下放在你机器上的这个服务。
动态时不行的问题有可能是因为我俩的service命名空间不同导致成了两个不同的服务。
”(我作为客户端对web服务所在机器开发人员说)
>>就是不能修改[WebService(Namespace="http://10.99.58.102/SpmSLAWebSevice/",
>>这个IP只是为了唯一标识这个服务的,看来并不代表本机的IP。
>>所以之前我发给你之后,都让你修改了IP,这样我再修改config文件时,访问你的服务就变成另一个不同的服务了。
>那不太可能吧,如果两个局域网内存在两个同样的,不混了吗,只有通过url唯一标识才行吧
是的,我见网上有人提了这个问题,说运行报异常提示服务有重名。但是同一个服务应该只有有一个名字吧,无论它放在哪里他的命名应该是不变的吧,要变只是变的他的物理地址。我是这么理解的。
>我觉得那个命名只要是唯一就行了,不一定是写成IP形式,网上一些例子都用的网站名字。
>如果每次换机器,都要打开程序再命名那就麻烦了。
人家的网站名字是唯一的url,其实就相当于公网ip访问.如:www.sohu.com

>是的,所以我想,可能我把现在的程序中[WebService(Namespace="http://10.99.58.102/SpmSLAWebSevice/",
>10.99.58.102这个地方变成一个英语名,只要不重复应该也行得通。

刚刚我上传了两个SLA,一个是传到我的本机上了,修改了配置,然后再传了一个到你的机器上
>现在看来是,一个web服务,创建后运行时只要不提示重名就行了,然后把这个服务放在任何位置对webservice程序本身都不用再作任何修改和处理。
>只需要在调用方的配置文件里修改webservice所在的机器物理地址












转载于:https://www.cnblogs.com/luowei/archive/2008/01/15/1040224.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值