【问题标题】:How to call the Magento API from VB.NET如何从 VB.NET 调用 Magento API
【发布时间】:2012-08-18 18:45:49
【问题描述】:

Magento 有一个 API,似乎有些人正在通过 VB.NET 使用它,但我尝试了几个小时后无法让它工作。

我正在使用 Magento 1.7.0.2 试图让 VB.NET 应用程序与 API 一起工作。 我正在使用符合 WS-I 的 Web 服务设置。

错误 1 ​​自定义工具错误:无法导入 WebService/Schema。无法从命名空间“urn:Magento”导入绑定“Mage_Api_Model_Server_Wsi_HandlerBinding”。命名空间“urn:Magento”中端口类型“Mage_Api_Model_Server_Wsi_HandlerPortType”的操作“catalogProductAttributeRemove”有以下语法错误:该操作没有匹配的绑定。检查 Binding 部分中的操作、输入和输出名称是否与 PortType 部分中的相应名称匹配。 d:\Documents\Visual Studio 2010\Projects\Mage\Mage\My Project\Settings.settings 1 1 Mage

如果我尝试将其添加为服务参考(而不是 Web 参考),则会收到一组不同的错误。

无法导入 wsdl:binding 无法导入 wsdl:port 无法导入 wsdl:portType

错误 5 自定义工具错误:无法为服务引用“ServiceReference1”生成代码。有关详细信息,请查看其他错误和警告消息。 d:\Documents\Visual Studio 2010\Projects\Mage\Mage\Service References\ServiceReference1\Reference.svcmap 1 1 Mage

警告 3 自定义工具警告:无法导入 wsdl:binding 详细信息:导入 wsdl:binding 所依赖的 wsdl:portType 时出错。 wsdl:portType 的 XPath: //wsdl:definitions[@targetNamespace='urn:Magento']/wsdl:portType[@name='Mage_Api_Model_Server_Wsi_HandlerPortType'] 错误源的 XPath://wsdl:definitions[@targetNamespace='urn:Magento']/wsdl:binding[@name='Mage_Api_Model_Server_Wsi_HandlerBinding'] d:\Documents\Visual Studio 2010\Projects\Mage\Mage\Service References\ ServiceReference1\Reference.svcmap 1 1 法师

警告 4 自定义工具警告:无法导入 wsdl:port 详细信息:导入 wsdl:port 所依赖的 wsdl:binding 时出错。 XPath 到 wsdl:binding: //wsdl:definitions[@targetNamespace='urn:Magento']/wsdl:binding[@name='Mage_Api_Model_Server_Wsi_HandlerBinding'] 错误源的 XPath://wsdl:definitions[@targetNamespace='urn:Magento']/wsdl:service[@name='MagentoService']/wsdl:port[@name='Mage_Api_Model_Server_Wsi_HandlerPort'] d:\Documents\Visual Studio 2010\Projects\Mage\Mage\Service References\ServiceReference1\Reference.svcmap 1 1 Mage

警告 2 自定义工具警告:无法导入 wsdl:portType 详细信息:运行 WSDL 导入扩展时引发异常:System.ServiceModel.Description.XmlSerializerMessageContractImporter 错误:命名空间 urn:Magento 中名为 catalogProductAttributeRemoveRequest 的元素消息丢失。 错误源的 XPath://wsdl:definitions[@targetNamespace='urn:Magento']/wsdl:portType[@name='Mage_Api_Model_Server_Wsi_HandlerPortType'] d:\Documents\Visual Studio 2010\Projects\Mage\Mage\Service References\ ServiceReference1\Reference.svcmap 1 1 法师

有人可以给我非常明确的说明/代码,告诉我如何拨打电话并获得结果吗?我什至无法让初始配置正确。我已经下载了一些其他人在线提供的代码,但如果不起作用——可能是因为它是针对早期版本的。

【问题讨论】:

  • 可以在浏览器中查看网络服务吗?
  • 是的,我在这里有一个测试站点:testshop.tokyorealtime.com/api/v2_soap?wsdl=1 我认为 API XML 可能有问题,或者与 .NET 稍微不兼容,但似乎其他人已经设法得到它工作。

标签: vb.net api magento


【解决方案1】:

终于搞定了。

像往常一样添加你的网络服务(它会编译失败,但无论如何都会添加它)

打开 Magento.wsdl(或任何您的 VS 在您的 Web 参考中调用的 wsdl 文件)并完全删除对 catalogProductAttributeRemove 的调用。

 <!--wsdl:operation name="catalogProductAttributeRemove">
    <wsdl:documentation>Delete attribute</wsdl:documentation>
    <wsdl:input message="typens:catalogProductAttributeRemoveRequest" />
    <wsdl:output message="typens:catalogProductAttributeRemoveResponse" />
</wsdl:operation-->

启动 Visual Studio 命令提示并导航到您的项目,然后是“Web 引用”

类型: wsdl /language:VB /out:Reference.vb Magento.wsdl /namespace:com.yourwebservicename.www

这将正确生成您需要继续的reference.vb文件。

【讨论】:

    【解决方案2】:
    Function getHTTPStream() As String
        Dim myh As HttpWebRequest = _
        HttpWebRequest.Create("http://yourmagentoweb/soap/api/?wsdl")
        myh.Timeout = 30000
        myh.UserAgent = "Test"
        Dim myR As HttpWebResponse = myh.GetResponse()
        Dim myEnc As Encoding = Encoding.GetEncoding(1252)
        Dim mySr As StreamReader = New StreamReader(myR.GetResponseStream(), myEnc)
    
        Return mySr.ReadToEnd()
    End Function
    

    该代码显然需要调整-我没有时间美化这些东西


    来自 Abid Hussain 的链接

    1.使用 wdsl 工具,我通过调用创建了一个 .vb 源文件:

    wsdl /language:VB /out:MageProxyClass.vb http:///api/v2_soap?wsdl

    2。之后我使用VB命令行编辑器将源文件编译成dll。

    vbc /out:MageProxyClass.dll /t:library /r:System.XML.dll,System.Web.Services.dll MageProxyClass.vb

    3.最后,我能够创建在我的 MageProxyClass.dll 中定义的 MagentoService 类的实例

    Private WithEvents msvc As New MagentoService() 
    

    4.示例:

     Public Class main
        Private WithEvents msvc As New MagentoService()
        Private ssid As String
        Private Sub main_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
        End Sub
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            ListBox1.Items.Clear()
            ListBox1.Items.Add("Trying to connect")
            msvc.loginAsync("xxxx", "xxxxxxxxxxxxxxxx")
        End Sub
    
        Public Sub MageLoginComplete(ByVal sender As System.Object, ByVal e As loginCompletedEventArgs) Handles msvc.loginCompleted
            ListBox1.Items.Add("Login completed")
            ssid = e.Result
            ListBox1.Items.Add(String.Concat("Session ID: ", ssid))
        End Sub
    End Class 
    

    【讨论】:

    • 我在发布之前遵循了这些说明,但它们没有用。无论如何都不需要将代码编译成 DLL,只需在 VB.NET 项目中访问它即可。你真的让它工作了吗?我要创建一个新的赏金,因为虽然 stackoverflow 自动给你积分,但我的问题仍然没有解决方案。
    【解决方案3】:

    你可能想试试这个例子

    还可以在此处找到更详细的 Magento C# 库:

    【讨论】:

      猜你喜欢
      • 2018-07-03
      • 2012-12-26
      • 2023-04-09
      • 2014-06-19
      • 2012-07-17
      • 1970-01-01
      • 2020-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多