首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web Service >

关于Web服务和客户端程序解决方案

2013-01-25 
关于Web服务和客户端程序大家好,我在Web Service中定义了两个方法,用来对SQL Server 2005数据库进行数据的

关于Web服务和客户端程序
大家好,我在Web Service中定义了两个方法,用来对SQL Server 2005数据库进行数据的操作。同时有一个客户端应用程序(Windows应用程序),添加了一个Web引用,引用该Web Service,在客户端实现对数据的查询、修改和删除操作。

在同一个机子上运行时,客户端是可以对数据库中的数据进行操作的。但是当我把Web Service运行在主机上,在另一台电脑上运行客户端程序时,会出现“主机积极拒绝”的错误,不能对主机上的数据库进行操作。

请问要怎么弄?
[解决办法]
当你把服务部署到与你的开发环境不同的主机(域名和端口号不同)上去以后,你的客户端怎样知道去访问新的地址?你是怎样做的?
[解决办法]
感觉sp1234说的很对,八成是引用写死了,楼主可能需要动态引用WebService
一、WebService
代码


[WebService(Namespace = "http://localhost/MyWebService")]//根据实际情况替换localhost[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class MyWebService : System.Web.Services.WebService
{
    public ProfessionalWebService() { }

    [WebMethod]
    public string HelloWorld()
    {
        return "Hello World";
    }

    [WebMethod(Description = "用户验证")]
    public string userValidate(string strUserName, string strPassword)
    {
        //使用strUserName、strPassword参数验证
        string strResult = userCheck(strUserName, strPassword);
        return strResult;
    }
    
    [WebMethod(Description = "帐号验证:信息匹配返回账号密码正确;信息不匹配返回账号密码错误。")]
    public static string userCheck(string strUserName, string strPassword)
    {
        //代码省略。。。
    }
}



二、Winform客户端

引用
添加引用System.Web.Services:右击引用--点添加引用-在.NET标签下找System.Web.Services-确定。

控件
WebService URL输入框txtWebserviceURL:用于输入WebService URL,就是能在浏览器打开的WebService URL
用户信息验证按钮btnUserCheck:点击执行用户验证
用户账号输入框txtUserName:用户账号输入
用户密码输入框txtPassword:用户密码输入
下一步操作按钮btnNextOperate:下一步操作按钮,默认Enabled属性为false

代码

using System.Net;
using System.Reflection;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Web.Services;
using System.Web.Services.Description;
using System.Web.Services.Protocols;
using System.Xml.Serialization;
private void btnUserCheck_Click(object sender, EventArgs e)
{
    //通过Webservice进行用户信息验证。成功:打开写入窗口的选项可用;失败:打开写入窗口的选项不可用
    try
    {
        // 1. 使用 WebClient 下载 WSDL 信息。
        WebClient web = new WebClient();
        Stream stream = web.OpenRead(txtWebserviceURL.Text + "?WSDL");//txtWebserviceURL中填写WebService URL
        // 2. 创建和格式化 WSDL 文档。
        ServiceDescription description = ServiceDescription.Read(stream);
        // 3. 创建客户端代理代理类。
        ServiceDescriptionImporter importer = new ServiceDescriptionImporter();


        importer.ProtocolName = "Soap";
        // 指定访问协议。
        importer.Style = ServiceDescriptionImportStyle.Client;
        // 生成客户端代理。
        importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties 
[解决办法]
 CodeGenerationOptions.GenerateNewAsync;
        importer.AddServiceDescription(description, null, null);
        // 添加 WSDL 文档。
        // 4. 使用 CodeDom 编译客户端代理类。
        CodeNamespace nmspace = new CodeNamespace();
        CodeCompileUnit unit = new CodeCompileUnit();
        unit.Namespaces.Add(nmspace);
        ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit);
        CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
        CompilerParameters parameter = new CompilerParameters();
        parameter.GenerateExecutable = false;
        parameter.GenerateInMemory = true;
        parameter.ReferencedAssemblies.Add("System.dll");
        parameter.ReferencedAssemblies.Add("System.XML.dll");
        parameter.ReferencedAssemblies.Add("System.Web.Services.dll");
        parameter.ReferencedAssemblies.Add("System.Data.dll");
        CompilerResults result = provider.CompileAssemblyFromDom(parameter, unit);
        // 5. 使用 Reflection 调用 WebService。
        if (!result.Errors.HasErrors)
        {
            Assembly asm = result.CompiledAssembly;
            Type t = asm.GetType("MyWebService");//根据自己的类名调整
            object o = Activator.CreateInstance(t);
            MethodInfo method = t.GetMethod("userValidate");//根据自己的方法名调整
            string param1 = txtUserName.Text;
            string param2 = txtPassword.Text;
            string strResult = (string)method.Invoke(o, new object[] { param1, param2 });//根据自己的参数数量调整
            if (strResult != "账号密码错误!")
            {
                btnNextOperate.Enabled = true;


                MessageBox.Show("验证成功,可以进入下一步操作!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            else
            {
                MessageBox.Show("验证失败,账号密码错误!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("请确保可以正确连接服务器!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning);
    }
}

热点排行