如何从ASP.Net访问PHPweb服务?我正在尝试在C#ASP.NetWeb应用程序中使用Web服务。该服务是用PHP构建的,位于我无法控制的某个远程服务器上,因此我无法修改它以向其添加元数据或其他内容。当我在VisualStudio2008中使用“添加Web引用”选项时,出现以下错误:HTML文档不包含Web服务发现信息。在尝试添加以下Web服务时。https://subreg.forpsi.com/robot2/subreg_command.php?wsdlWeb服务功能在VisualStudio2008中公开并显示。但我无法添加对它的引用以在ASP.Net应用程序中使用。t3Service“说明方法__construct()create_contact()get_contact()get_domain_info()get_last_error_code()get_last_error_msg()get_NSSET()get_owner_mail()登录()register_domain()register_domain_with_admin_contacts()renew_domain()request_sendmail()send_auth_info()transfer_domain()我还尝试了wsdl.exe方法,检索xml并将其复制到wsdl文件并生成代理类。但是wsdl输出包含警告,并且生成的代理类会跳过公开的函数并生成如下内容://CODEGEN:Operationbinding'create_contact'innamespace'urn:t3'isignored.use=encoded消息中的每个消息部分都必须指定一个类型。//CODEGEN:命名空间'urn:t3'中的操作被忽略Bind'get_contact'。use=encoded消息中的每个消息部分都必须指定一个类型。//CODEGEN:命名空间“urn:t3”中的操作绑定“get_domain_info”被忽略。use=encoded消息中的每个消息部分都必须指定一个类型。//CODEGEN:忽略命名空间“urn:t3”中的操作绑定“get_last_error_code”。use=encoded消息中的每个消息部分都必须指定一个类型。//CODEGEN:忽略命名空间“urn:t3”中的操作绑定“get_last_error_msg”。use=encoded消息中的每个消息部分都必须指定一个类型。//CODEGEN:忽略命名空间“urn:t3”中的操作绑定“get_NSSET”。use=encoded消息中的每个消息部分都必须指定一个类型。//CODEGEN:命名空间“urn:t3”中的操作绑定“get_owner_mail”被忽略。use=encoded消息中的每个消息部分都必须指定一个类型。//CODEGEN:忽略命名空间“urn:t3”中的操作绑定“send_auth_info”。use=encoded消息中的每个消息部分都必须指定一个类型。//CODEGEN:忽略命名空间“urn:t3”中的操作绑定“transfer_domain”。use=encoded消息中的每个消息部分都必须指定一个类型。//CODEGEN:忽略命名空间“urn:t3”中的操作绑定“request_sendmail”。use=encoded消息中的每个消息部分都必须指定一个类型。//CODEGEN:忽略命名空间“urn:t3”中的操作绑定“login”。use=encoded消息中的每个消息部分都必须指定一个类型。//CODEGEN:命名空间'urn:t3'中的操作绑定'register_domain'被忽略。use=encoded消息中的每个消息部分都必须指定一个类型。//CODEGEN:忽略命名空间“urn:t3”中的操作绑定“register_domain_with_admin_contacts”。use=encoded消息中的每个消息部分都必须指定一个类型。//CODEGEN:忽略命名空间“urn:t3”中的操作绑定“renew_domain”。use=encoded消息中的每个消息部分都必须指定一个类型。编辑:我为我的手写课程尝试了这段代码。publicStringmakeWebRequest(StringmethodName){//创建网络请求HttpWebRequestrequest=WebRequest.Create("https://subreg.forpsi.com/robot2/subreg_command.php/")asHttpWebRequest;//为请求添加认证request.Credentials=newNetworkCredential("foo@mydomain.com","bar");request.Method="POST";request.ContentType="文本/xml";request.Headers.Add("SOAPAction:https://subreg.forpsi.com/robot2/subreg_command.php/"+methodName);//获取响应使用(HttpWebResponseresponse=request.GetResponse()asHttpWebResponse){//获取响应流StreamReaderreader=newStreamReader(response.GetResponseStream());//控制台应用程序输出//Console.WriteLine(reader.ReadToEnd());返回reader.ReadToEnd();但是当我尝试获取响应时它返回远程服务器返回错误:(500)内部服务器错误。如上所述-您必须为此Web服务手动编写代理“代理”。手动进行Web服务调用的示例-您可能需要调整一些方法。privatestringMakeWebServiceCall(stringmethodName,stringrequestXmlString){WebRequestwebRequest=WebRequest.Create("https://subreg.forpsi.com/robot2/subreg_command.php");HttpWebRequesthttpRequest=(HttpWebRequest)webRequest;httpRequest.Method="POST";httpRequest.ContentType="文本/xml";httpRequest.Headers.Add("SOAPAction:https://subreg.forpsi.com/robot2/subreg_command.php/"+methodName);流requestStream=httpRequest.GetRequestStream();//创建流并完成请求StreamWriterstreamWriter=newStreamWriter(requestStream);streamWriter.Write(String.Format(this.GetSoapString(),requestXmlString));streamWriter.Close();//获取响应WebResponsewebResponse=httpRequest.GetResponse();流responseStream=webResponse.GetResponseStream();StreamReaderstreamReader=newStreamReader(responseStream);//将响应读入xml文档System.Xml.XmlDocumentsoapResonseXMLDocument=newSystem.Xml.XmlDocument();soapResonseXMLDocument.LoadXml(streamReader.ReadToEnd());//仅返回表示响应详细信息(内部请求)的xmlreturnsoapResonseXMLDocument.GetElementsByTagName(methodName+"Result")[0].InnerXml;我建议创建可用于生成对象的xsd(使用xsd.exe),然后您可以序列化/反序列化对实际对象的响应和请求编辑:GetSoapString()方法私有字符串GetSoapString(){StringBuildersoapRequest=新的StringBuilder("");soapRequest.Append("{0}");soapRequest.Append("");返回soapRequest.ToString();}Steve引用调用一个看起来像:123Response:false“webservice”是一个非常通用的术语。某些类型的Web服务可能会实现WSDL——但这不是必需的。IIRC你需要一个SOAP接口来提供WSDL,而nuSOAP和PHPSOAP扩展都支持WSDL。所以看起来远程端没有正确实现。编辑:以前我有500个内部服务器错误,因为我的soap字符串格式不正确。我解析了从Web服务返回的xml,并通过查看xml构建了我的soap字符串消息。我终于在Dan^的帮助和互联网上的一些研究下弄明白了。谢谢丹。我克服了500服务器错误。现在我能得到到很少登录失败的响应…publicStringMyWebServiceCall(){stringstrSoapMessage=""+""+""+""+"Support@foo.net"+"bar"+""+""+"";HttpWebRequestreq=(HttpWebRequest)WebRequest.CreateDefault(newUri(@"https://subreg.forpsi.com/robot2/subreg_command.php/"));req.ContentType="text/xml;charset=UTF-8";req.Method="POST";req.Accept="文本/xml";req.Headers.Add("SOAPAction",@"https://subreg.forpsi.com/robot2/subreg_command.php/");req.ProtocolVersion=HttpVersion.Version11;req.Credentials=CredentialCache.DefaultCredentials;//req.Credentials=newNetworkCredential("Support@foo.net","bar");StreamWriterstm=newStreamWriter(req.GetRequestStream(),Encoding.ASCII);stm.Write(strSoapMessage);stm.冲洗();关闭();HttpWebResponsewr=(HttpWebResponse)req.GetResponse();StreamReadersrd=newStreamReader(wr.GetResponseStream());字符串resulXmlFromWebService=srd.ReadToEnd();返回resulXmlFromWebService;}现在下一个问题是传递正确的凭据并处理响应以执行其他操作...顺便说一句,这是响应....false编辑:值false是正确的,因为我发送了错误的凭据我正在调用网络以类似方式服务其他功能,并能够调用web服务的所有功能并检索相应的返回值,然后进行其他处理。感谢所有帮助解决问题的人。您好C#学习教程到此结束:如何从ASP.Net访问PHPWeb服务?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
