zoukankan      html  css  js  c++  java
  • 我的第一个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

    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所在的机器物理地址












  • 相关阅读:
    java--对象引用与对象的区别
    小程序中js获取图片高度---多用于全屏广告图
    在WPF中显示GIF图片并实现循环播放
    在WPF中调用Winform控件
    开篇!WPF自定义控件(1)——转盘菜单
    【转】浅谈C#委托和事件
    给宝宝洗衣服,你应该按套路出牌
    代码复用,我应该知道的这些事
    Arrays.asList返回的List与new ArrayList的区别
    有关C++11标准的一些粗浅认识
  • 原文地址:https://www.cnblogs.com/luowei/p/1040224.html
Copyright © 2011-2022 走看看