时之沙漏 2024-06-25 11:12 采纳率: 0%
浏览 36
已结题

C#创建webservice接口,三方通过多次跳转访问本方服务,获取wsdl文档,wsdl中ip地址为局域网内本机地址而非三方直接访问的地址。

C#创建webservice接口,三方通过多次跳转访问本方服务,获取wsdl文档,wsdl中ip地址为局域网内本机地址而非三方直接访问的地址。请教如何让三方获取的wsdl文档中地址为外网映射IP和端口(浏览器中输入的地址)。

对方启动的服务如下,浏览器中地址端口和文档中一致,没有问题

img


我方启动的服务如下,仅在本机启动跳转做示例,浏览器中地址端口和文档不一致,出现问题

img

相关接口程序情况如下:
配置文件:

<?xml version="1.0"?>
<configuration>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/></startup><system.serviceModel>
        <behaviors>
            <serviceBehaviors>
                <behavior name="">
                    <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
                    <serviceDebug includeExceptionDetailInFaults="true" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <services>
            <service name="XmHttpServerForm.Service1">
                <endpoint address="" binding="basicHttpBinding" contract="XmHttpServerForm.IService1">
                    <identity>
                        <dns value="localhost" />
                    </identity>
                </endpoint>
                <endpoint address="http://10.39.14.141:8002/" binding="mexHttpBinding" contract="IMetadataExchange" />
                <host>
                    <baseAddresses>
                        <add baseAddress="http://10.39.14.141:8002/Service1/" />
                    </baseAddresses>
                </host>
            </service>
        </services>
    </system.serviceModel>
</configuration>

接口:

namespace XmHttpServerForm
{
    // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService1”。
    [ServiceContract]
    public interface IService1
    {
      //  [OperationContract]
      //  void DoWork();
        [OperationContract]
        string JSYX(string context);
    }
}

实现:


namespace XmHttpServerForm
{
    // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“Service1”。
    public class Service1 : IService1
    {
        //public void DoWork()
        //{
        //}

        string m_BankCode = "301000";
        string m_UnitCode = "G321282";
        string m_AppId = "01";
        string m_BankNo = "03";
        string m_CheckCode = "";
        byte[] key = { 17, 34, 79, 88, 136, 16, 64, 56, 40, 37, 121, 81, 203, 221, 85, 102, 119, 41, 116, 152, 48, 64, 54, 226 };
        public string JSYX(string context)
        {
            string curClassName = "";
            return curClassName;
        }
    }
}

主程序启动服务:

namespace XmHttpServerForm
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {

            ServiceHost host = new ServiceHost(typeof(Service1));
            host.Open();
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm());
        }
    }
}

  • 写回答

24条回答 默认 最新

  • 阿里嘎多学长 2024-06-25 11:12
    关注
    获得0.30元问题酬金

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    在C#中创建Web服务时,确保第三方通过多次跳转访问本方服务时获取的WSDL文档中的IP地址是外网映射的IP和端口,而不是局域网内的本机地址,需要进行一些配置调整。以下是一些步骤和建议,帮助你解决这个问题:

    1. 确保WSDL中的地址正确:在<service>元素的<endpoint>元素中,address属性应该设置为第三方能够访问的地址。这个地址应该是外网可访问的地址。

    2. 使用<host>元素的<baseAddresses>:在<system.serviceModel>配置节中,使用<host>元素的<baseAddresses>来指定服务的基础地址。这个地址应该是服务的外网地址。

    3. 使用<identity>元素:虽然在配置文件中你已经使用了<identity>元素,但请确保<dns>元素的值是第三方能够解析的DNS名称,而不是localhost

    4. 检查防火墙和路由器设置:确保你的防火墙和路由器设置允许从外网访问指定的端口。

    5. 使用端口映射:如果你的服务运行在局域网内,你需要在路由器上设置端口映射,将外网IP的端口映射到内网机器的端口。

    6. 测试WSDL访问:使用外网IP和端口访问WSDL,确保第三方能够获取到正确的WSDL文档。

    根据你提供的配置文件和代码,以下是一些具体的建议:

    • <identity>元素中的<dns>值从localhost更改为第三方能够访问的DNS名称或外网IP。
    • 确保<endpoint>元素的address属性设置为外网可访问的地址,例如http://你的外网IP:8002/Service1/

    配置文件示例(部分):

    <system.serviceModel>
        ...
        <services>
            <service name="XmHttpServerForm.Service1">
                <endpoint address="http://你的外网IP:8002/Service1/" binding="basicHttpBinding" contract="XmHttpServerForm.IService1">
                    <identity>
                        <dns value="你的DNS名称或外网IP" />
                    </identity>
                </endpoint>
                ...
            </service>
        </services>
        ...
    </system.serviceModel>
    

    请注意,这里的“你的外网IP”和“你的DNS名称”应该替换为实际的外网IP地址或DNS名称。

    如果你需要进一步的帮助,或者需要更详细的步骤,请随时告诉我。我会尽力提供更具体的帮助。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 7月3日
  • 创建了问题 6月25日