无法连接到WSDL

时间:2011-09-01 12:29:09

标签: c# .net soap wsdl

我获得了一个使用WSDL文件连接到Web服务的SDK。我在自述文件中给出了示例代码以及如何设置文件的分步说明,但即使遵循以下所有代码也无法编译。

说明和代码在这里。 http://dl.dropbox.com/u/3425987/README.txt

WSDL文件在http://dl.dropbox.com/u/3425987/arm-inlined.wsdl

似乎没有找到ArmServiceImplService。

非常感谢任何有关我所做错事的帮助。

编辑:我正在做的唯一不按照说明操作的是我使用的是VS 2010,而不是2008.我不认为这会是问题,但我的其他选项已经用完了。 / p>

5 个答案:

答案 0 :(得分:1)

作为WSDL的一部分,有一个用于访问SOAP服务的位置/ URL - 根据WSDL,它是:

http://localhost:8080/ARM/ARM/

此位置将导致您的客户端尝试访问正在运行的系统上的端口8080 ...除非您在那里运行SOAP服务,否则这将无效(连接被拒绝和/或超时)... < / p>

来自自述文件中的示例来源:

// TODO: Replace with live server URL when ready
armService.Url = "http://localhost:8081/ARM/ARM/";

此评论告诉您将URL替换为实时服务器URL ...

根据您的问题,我假设您没有更换网址/没有实时服务器网址?

编辑 - 根据OP的评论:

如果您的代码没有编译,您似乎已跳过第7点并遵循自述文件中的说明

  

7)在Visual Studio打开新创建的项目后,右键单击   在SampleArmClient中         解决方案资源管理器并选择“添加服务引用”

     

8)在   “添加服务引用”对话框,在标有URL的框中输入   要么:a)来自真实或“模拟”ARM服务的WSDL的URL   (有关说明           在启动“模拟”ARM服务时,请参阅第7节   例,           如果在端口8081上启动“模拟”服务,则为   服务           将http://localhost:8081/ARM/ARM?WSDL.Please注意到   要从内部使用的URL               您的代码是http://:/ ARM / ARM。它不是   包含“?WSDL” - 那               后缀严格用于发现Web服务。 b)   wsdl在解压缩的磁盘上的位置   分配。           例如,如果将分发解压缩到c:/ temp中   目录,           网址将是   C:\ TEMP \臂\ SRC \主\资源\ GOV \ HUD \臂\ WSDL \臂inlined.wsdl。           (这是WSDL的版本,其中包含模式   .NET可以           在没有外部模式的情况下解析引用。)

答案 1 :(得分:1)

最后一块拼图给你。我通过电子邮件回过头来看看说明书中7/8到底是什么问题,这就是我向HUD报告的内容:

在您为Visual Studio 2008提供的说明中,项目编号8指示您添加服务引用。现在我的一部分是正确的,部分我没有,因为我对.net太新了,但是,你需要调整该行来读取添加新的Web引用(服务引用不再是一个选项)而不是服务引用,告诉他们将其命名为ARM

非常重要

这也适用于VS2010,这是我昨晚成功完成的工作。只是你知道,我编辑了原始代码帖子以删除破坏的行,所以只需对id和路径进行更改即可。我对抗了我从hud支持(安德烈)获得的开发网址,而不是试图在我的机器上运行该服务。我建议你这样做,因为如果他们的样品已经过时了,那么他们作为样品提供的服务也是我敢打赌的。 dev url工作得很好,虽然我确实也发现了一些差异。它们已被修复,因为它应该是测试xml提交文件的最佳位置。

答案 2 :(得分:0)

首先,我遇到了同样的问题,所以我还没有得到所有答案。但是使用VS2010,您需要添加一些代码来建立连接。问题是您必须在标题中进行身份验证,并且使用VS2008及更高版本,它不会这样做。

现在,还有其他问题。如果你想运行databag 4。他们给我们的代码是针对较早的数据库,并且不运行数据条4发送/接收函数,因为它不包含它们的样本。我已经要求他们包含它,但谁知道需要多长时间。

此外,如上所述,步骤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;
        }
    }
}
}

答案 3 :(得分:0)

嗯,奇迹永远不会停止。我刚刚给出了下面代码的另一个镜头。当然,这给了我一个错误:

    api client = new api(); 
    client.PreAuthenticate = true; 
    client.Credentials = new NetworkCredential(credentials.UserName, credentials.Password); 

所以我把它重新拿出来并重新开始,我收到了来自HUD的回复。那个怎么样!!它只发送代理文件,但它连接,发送文件,并得到回复给我。现在,我所要做的就是创建我需要的其他功能,以及将每个公司的凭据传递给它以及如何获取响应的方法,以便我可以在我的asp站点中记录它们,并且所有这些都将很好地与世界相关联再次。 bin文件显示它正在创建一个exe,所以希望我可以从我的asp代码中调用它,向每个公司发送文件的凭据和路径,并且它可以一次发送一个,获取响应并记录它。然后稍后运行响应以确保所有数据都通过验证。

还有很多工作要做,但是,这是一个很大的进步。希望这会有所帮助,如果你打败了我,请告诉我。我是承包商,可能永远不会得到报酬来完成项目的这一方,但很高兴知道我现在可以走这条路。我可能只是为了满足我打败机器的需要。 :)但是如果你打败我,那么请给我最后的决定,我会确保HUD得到一个完整的更新,所以没有其他人必须在墙上击败他们的头。

答案 4 :(得分:0)

我只是想我会跟进这个。上述解决方案适用于除了需要传输的较大文件之外的所有文件。为了纠正这个问题,我只是从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;
        }

一旦保存完毕,我就可以保持连接足够长的时间来传输非常大的文件。