• 使用WCF进行跨平台开发之二(IIS托管WCF服务并使用php平台调用)


    上一篇中,使用控制台托管了WCF服务,但是如果想从PHP和java平台调用,必须将其托管到IIS中(并不是必须的,还是有其他的方式的 比如windows azure)

    1.系统必备

         首先,必须打开IIS和WAS,如果没有,可以在控制面板--程序--打开或关闭Windows功能打开。

         而后必须的当然是php环境,这就根据您自己的需求配置啦,但是必须注意的是,必须打开php.ini中soap的扩展,步骤是,打开php.ini,搜索php_soap.dll,去掉前面的注释“;”,然后重起php服务器。

    2.在IIS中托管WCF服务

         在IIS默认网站中添加应用程序emp,并在高级设置中,设置应用程序池为“ASP.NET v4.0”,并设置默认网站右键--编辑版定,在http类型中编辑IP地址和主机名

    image

    这里设置的原因是,第一,php平台在局域网中的另外一台机器上,主机名这里的设置,是因为主机名影响wsdl的生成,如果不设置,在wsdl中生成的location包括的是托管机器名而不是ip地址。

         在新建的虚拟目录对应的实际目录中,添加web.config文件,配置wcf服务和终结点,并打开元数据公开,然而,因为这里不是使用常用的svc文件托管的服务,所以需要serviceActivations节点配置服务,并在服务器行为中打开servicedebug节点的includeExceptionDetailInFaults方便调试。

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <system.serviceModel>
        <serviceHostingEnvironment>
          <serviceActivations>
            <add relativeAddress="EmployeeManagement.svc" service="Implemention.EmployeeManagement"/>
          </serviceActivations>
        </serviceHostingEnvironment>
        <behaviors>
          <serviceBehaviors>
            <behavior name="ExposeMetaDataBehavior">
              <serviceDebug includeExceptionDetailInFaults="true"/>
              <serviceMetadata httpGetEnabled="true" />
            </behavior>
          </serviceBehaviors>
        </behaviors>
        <services>
          <service name="Implemention.EmployeeManagement" behaviorConfiguration="ExposeMetaDataBehavior">
            <endpoint address="" binding="basicHttpBinding" bindingConfiguration="" contract="Contracts.IEmployeeManagement" />
          </service>
        </services>
      </system.serviceModel>
        <system.webServer>
            <directoryBrowse enabled="true" />
        </system.webServer>
    </configuration>
     
     
    在目录中新建一个bin目录,并复制上一篇中生成的Implemention.dll和Contracts.dll,至此,服务已经托管到了IIS中。
     

    3.使用PHP调用托管在IIS中的WCF服务

    在PHP服务器中打开浏览器,并浏览http://192.168.11.1/emp/EmployeeManagement.svc测试服务是否托管正常。

    image

    出现以上页面,证明在IIS中托管正常,现在,可以使用php开发程序调用此服务啦。

    使用自己喜欢的开发工具编辑一个php页面

    GetSalary.php

    <html>
     
    <head>
    <meta http-equiv="Content-Type" content="text/html;charset=gb2312">
    <title>使用PHP调用WCF</title>
    </head>
    <body>
    <form method="post">
    <table border="0.5">
        <tr>
            <td>员工ID</td>
            <td><input type="text" id="Id" name="Id"/></td>
        </tr>
        <tr>
            <td>姓  名</td>
            <td><input type="text" id="Name" name="Name"/></td>
        </tr>
        <tr>
            <td>部  门</td>
            <td><input type="text" id="Department" name="Department"/></td>
        </tr>
        <tr>
            <td></td>
            <td><input type="submit" id="submit" name="submit" value="查询"/></td>
        </tr>
    </table>
    </form>
    </body>
    </html>
    <?php
        try 
        {
            if($_POST)
            {
                $client=new SoapClient("http://192.168.11.1/emp/EmployeeManagement.svc?wsdl");
                //php使用以数组的字符串下标对应.net的属性名称
                $params=array();
                $params["Id"]=$_POST["Id"];
                $params["Name"]=$_POST["Name"];
                $params["Department"]=$_POST["Department"];
                //这里使用emp,因为在我们定义服务契约时,使用的是emp这个形参
                //传入的依然是一个数组,键名是行参名,键值为以上构造的数组
                $response=$client->GetSalaryOfLastMonth(array("emp"=>$params));
                $result=$response->GetSalaryOfLastMonthResult;
                
                
                echo "上月薪水为:".$result->Salary;
            }
            
        }
        catch (Exception $ex)
        {
            echo $ex->getMessage();
        }
    ?>

    开启php服务器,访问页面,出结果:

    image

    下一章将续写java访问WCF服务的具体操作,可是已经到饭点啦。先做个决定。。。。。

  • 相关阅读:
    Problem S: 分数类的模板数组类
    Problem E: 向量的运算
    Problem D: 强悍的矩阵运算来了
    Problem C: Person类与Student类的关系
    Problem B: 还会用继承吗?
    Problem A: 求个最大值
    Problem B: 数组类(II)
    树的直径题集
    LCA题集
    线段树总结
  • 原文地址:https://www.cnblogs.com/xiaoyaojian/p/2752749.html
Copyright © 2020-2023  润新知