连接到WSDL时出现故障
本文关键字:故障 WSDL 连接 | 更新日期: 2023-09-27 18:07:10
我得到了一个SDK,它使用WSDL文件连接到web服务。我在README中获得了示例代码以及如何设置文件的一步一步说明,但即使遵循所有内容,代码也无法编译。
说明和代码在这里。http://dl.dropbox.com/u/3425987/README.txt
WSDL文件在这里http://dl.dropbox.com/u/3425987/arm-inlined.wsdl
没有找到ArmServiceImplService.
任何帮助我做错了是非常感激。
编辑:我做的唯一一件事,不遵循说明是我使用VS 2010,而不是2008。我不认为这是个问题,但我已经没有其他选择了。
作为WSDL的一部分,有一个用于访问SOAP服务的位置/URL -根据WSDL,它是:
http://localhost:8080/ARM/ARM/
此位置将导致您的客户端试图访问它正在运行的系统上的8080端口…除非您在那里运行SOAP服务,否则这将不起作用(连接被拒绝和/或超时)…
// TODO: Replace with live server URL when ready
armService.Url = "http://localhost:8081/ARM/ARM/";
这个注释告诉你用实时服务器URL替换URL…
从你的问题中我假设你没有替换URL/没有实时服务器URL ?
编辑-根据OP的评论:
如果你的代码没有编译,你似乎已经跳过了第7点,并按照README
中的说明进行操作。7) Visual Studio打开新创建的项目后,右键单击的SampleArmClient中解决方案资源管理器,选择"添加服务引用"
8)"添加服务引用"对话框中,在标注URL的框中输入a)从真实的或"模拟的"ARM服务到WSDL的URL(用于指示关于启动"模拟"ARM服务,请参见第7节。)为的例子,如果"mock"服务在端口8081上启动,则指向服务是http://localhost:8081/ARM/ARM?WSDL.Please注意了吗要从内部使用的URL您的代码是http://:/ARM/ARM。事实并非如此包含"?"WSDL"——那后缀严格用于发现web服务。b)解压文件中WSDL所在的磁盘位置分布。例如,如果将发行版解压缩到c:/temp目录,URL应该是c: ' temp '臂主要' src ' ' '政府资源' hud ' ' wsdl ' arm-inlined.wsdl手臂。(这是包含模式的WSDL版本.NET可以解析没有外部模式的引用)
最后一块拼图给你。我查看了我的电子邮件,看看说明中7/8的问题到底是什么,这就是我向HUD报告的内容:
在您为Visual Studio 2008提供的说明中,第8项告诉您添加服务引用。现在部分我做对了,部分我没有,因为我对。net太陌生了,但是,你需要调整那一行来阅读添加一个新的Web引用(服务引用不再是一个选项)而不是服务引用,这是非常重要的,告诉他们命名为ARM
这也适用于VS2010,这是我昨晚设法得到的工作。正如你所知,我编辑了原始的代码帖子,删除了中断的行,所以只要改变id和路径,你应该很好。我根据我从hud支持(Andrey)获得的开发url运行它,而不是试图在我的机器上运行服务。我建议你也这么做,因为如果他们的样品已经过时这么久,那么我敢打赌他们提供的样品服务也过时了。dev url运行得很好,尽管我也发现了一些差异。它们已经被修复了,所以它应该是测试xml提交文件的最佳位置。
好吧,奇迹永远不会停止。我只是对下面的代码进行了另一次尝试。当然,它给了我一个错误:
api client = new api();
client.PreAuthenticate = true;
client.Credentials = new NetworkCredential(credentials.UserName, credentials.Password);
所以我把它取出来重新运行,我收到了HUD的回复。怎么样!!它只发送代理文件,但它连接了,发送了文件,并得到了回复给我。现在我所要做的就是创建我需要的其他功能,以及一种将每个公司的凭据传递给它的方法,以及如何获得响应,以便我可以将它们登录到我的asp站点中,并且一切都会很好。bin文件显示它正在创建一个exe,所以希望我可以从我的asp代码中调用它,将凭证和路径发送到每个公司的文件,它可以一次发送一个,获得响应并记录它。然后稍后运行响应,以确保所有数据都通过验证。
还有很多工作要做,但是,这是一个很大的进步。希望这对你有帮助,如果你抢先一步告诉我。我是一个承包商,可能永远不会得到报酬来完成项目的这一方面,但很高兴知道我现在可以走这条路了。我这么做可能只是为了满足我打败机器的需要。但是如果你抢先我一步,请把最终版本发给我,我将确保HUD得到一个完整的更新,这样就没有其他人不得不把头撞在墙上了。
首先,我有同样的问题,所以我还没有所有的答案。但是使用VS2010时,您确实需要添加一些代码来进行连接。问题是你必须在头和VS2008及以上版本中进行身份验证,它不会这样做。
现在,还有其他问题。如果您想运行数据库4,那就是。他们给我们的代码是一个早期的数据库,并没有运行databag4发送/接收函数,因为它没有包含它们的示例。我已经要求他们把它包括进去,但谁知道要花多长时间。
同样,如上所述,步骤7/8是至关重要的,并且指示是不正确的。我也已经通知了技术支持,但截至我最后一次检查,他们还没有更新说明来包含这一点。对不起,我现在不记得具体细节了,但这是我在第三次或第四次做的时候通过阅读屏幕发现的一些非常简单的东西。
正如你会注意到下面的代码,我已经在正确的方向取得了一些进展,但我不是一个。net开发人员。我是一个典型的asp家伙,所以我仍然无法得到它的完整功能,并使用SOAP UI工具为我们的上传目前。这意味着我必须手工处理所有30个公司,一次一个文件。每个4个文件。尽管如此,我还是在一天内完成了工作,并且我的时间得到了很好的报酬,所以这还好,但是我对目前为止我得到的支持感到沮丧,所以如果你从中发现更多,请告诉我。
using System;
using System.Collections.Generic;
using System.Text;
using ARMService.ARM;
using System.Net;
using System.IO;
using System.Threading;
namespace ARMService
{
public partial class api : System.Web.Services.Protocols.SoapHttpClientProtocol
{
//added "protected overide" to get past the pre-auth issue with VS2008 and above since I'm running VS2010
//Now this is in place, you will send the authentication header at the first request.
//Since this implementation is using the credentials from the WebClientProtocol, you will be required to set these in advance.
//But I guess you were doing that anyways. Furthermore, I chose to only do the pre-authentication if the PreAuthenticate
//property was set to true. (deactivated if statement so it will always preauth.)
//So if you want to consume this service, this is how you would initiate it;
//api client = new api();
//client.PreAuthenticate = true;
//client.Credentials = new NetworkCredential("username", "password");
protected override System.Net.WebRequest GetWebRequest(Uri uri)
{
HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(uri);
// if (PreAuthenticate) //removed if statement because I want all items to pre-auth
// {
NetworkCredential networkCredentials = Credentials.GetCredential(uri, "Basic");
if (networkCredentials != null)
{
byte[] credentialBuffer = new UTF8Encoding().GetBytes(networkCredentials.UserName + ":" + networkCredentials.Password);
request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(credentialBuffer);
}
else
{
throw new ApplicationException("No network credentials");
}
// }
return request;
}
}
class Program
{
static void Main(string[] args)
{
ArmServiceImplService armService = new ArmServiceImplService();
// TODO: Replace with live server URL when ready
armService.Url = "https://HUD will give you the url/ARM/ARM/";
armService.PreAuthenticate = true;
NetworkCredential credentials = new NetworkCredential();
// TODO: Replace with userid/password issued by HUD for HCS system when ready
credentials.UserName = "yourHUDMXnumber";
credentials.Password = "yourpassword";
armService.Credentials = credentials;
//These three removed per second post and fixed the last issue
//api client = new api();
//client.PreAuthenticate = true;
//client.Credentials = new NetworkCredential(credentials.UserName, credentials.Password);
//removed for now to try only postAgencyData
//doPing(armService);
//doGetReference(armService);
//postSubmissionResponse submissionId = doPostSubmission(armService);
//fixed
postSubmissionResponse psr = AgencyData(armService);
while (dopostAgencyDataResponse(armService, psr) != true)
{
// sleep for 60 seconds before checking agin.
Thread.Sleep(60000);
}
}
private static void doGetReference(ArmServiceImplService armService)
{
getReference getReference = new getReference();
// TODO: Replace 80000 with your agency HCS id.
getReference.agcHcsId = 80000;
getReference.referenceId = 0;
referenceItem[] referenceItems = armService.getReference(getReference);
foreach (referenceItem referenceItem in referenceItems)
{
Console.WriteLine(referenceItem.id);
Console.WriteLine(referenceItem.name);
Console.WriteLine(referenceItem.longDesc);
Console.WriteLine(referenceItem.shortDesc);
}
}
private static void doPing(ArmServiceImplService armService)
{
ping pingIn = new ping();
// TODO: Replace 80000 with your agency HCS id.
pingIn.agcHcsId = 80000;
string pingString = armService.ping(pingIn);
Console.WriteLine(pingString);
}
private static postSubmissionResponse AgencyData(ArmServiceImplService armService)
{
postAgencyData AgencyData = new postAgencyData();
submissionHeader40 header = new submissionHeader40();
// TODO: Replace 80000 with your agency HCS id.
header.agcHcsId = 80000;
header.agcName = "Your Agency Name";
// TODO: Replace 8 with your CMS vendor id issued to you by ARM Development Team.
header.fiscalYearId = 17;
header.reportingPeriodId = 3;
header.cmsVendorId = yourVendorNUmber;
AgencyData.submissionHeader40 = header;
// TODO: Replace fake databag with valid databag of your own
FileStream file = new FileStream("c:/Users/Public/Documents/AgencyProfileData.xml", FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(file);
string str = sr.ReadToEnd();
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
AgencyData.submissionData = encoding.GetBytes(str);
//fixed
postSubmissionResponse psr = armService.postAgencyData(AgencyData);
Console.WriteLine("Submitted Data returned id : " + psr.submissionId);
return psr;
}
private static Boolean dopostAgencyDataResponse(ArmServiceImplService armService,
postSubmissionResponse postAgencyDataResponse)
{
getSubmissionInfo getSubmissionInfo = new getSubmissionInfo();
// TODO: Replace 80000 with your agency HCS id.
getSubmissionInfo.agcHcsId = 80000;
getSubmissionInfo.submissionId = postAgencyDataResponse.submissionId;
getSubmissionInfoResponse response = armService.getSubmissionInfo(getSubmissionInfo);
Console.WriteLine("SubmissionInfo Status Date = " + response.statusDate);
Console.WriteLine("SubmissionInfo Status Message = " + response.statusMessage);
// if Done or Error returned, then return true to stop polling server.
if (response.statusMessage.Equals("DONE") || response.statusMessage.Contains("ERROR"))
{
return true;
}
else
{
return false;
}
}
}
}
我只是想跟进一下。上述解决方案适用于除了我需要传输的较大文件之外的所有文件。为了纠正这个问题,我只是从program.cs页面中删除(剪切)了受保护的覆盖语句,并将其复制到references.cs页面中,只做了两个调整。新的语句是:
protected override System.Net.WebRequest GetWebRequest(Uri uri)
{
HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(uri);
if (PreAuthenticate)
{
NetworkCredential networkCredentials = Credentials.GetCredential(uri, "Basic");
if (networkCredentials != null)
{
byte[] credentialBuffer = new UTF8Encoding().GetBytes(networkCredentials.UserName + ":" + networkCredentials.Password);
request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(credentialBuffer);
}
else
{
throw new ApplicationException("No network credentials");
}
}
request.KeepAlive = false;
return request;
}
保存后,我可以保持连接足够长的时间来传输真正大的文件