关于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)
{
//代码省略。。。
}
}
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);
}
}