来自PHP的ConsumeWCF服务 [英] ConsumeWCF service from PHP

查看:113
本文介绍了来自PHP的ConsumeWCF服务的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经创建了WCF服务项目。我可以使用.NET框架。我可以传递一个变量,并且可以在使用PHP时获取返回变量。但是当我将类对象从PHP传递给服务时,我无法使用该服务。



Iservice.cs

< pre lang =C#> 命名空间 WCFTest
{
// 注意:您可以使用重构菜单上的重命名命令在代码和配置文件中一起更改接口名称IService1。
[ServiceContract ]
public interface IService1
{
[OperationContract]
string getVal(Student [] st);

[OperationContract]
string PassMember(CompMember cmp);
}

public class ALSubjects
{
string SID;
string SName;
string sResult;

public string SubID
{
get { return SID; }
set {SID = value ; }
}

public string SubName
{
get { return SName; }
set {SName = value ; }
}

public string SubResult
{
get { return sResult; }
set {sResult = value ; }
}
}

public class 学生
{
string stID;
string stName;
int stAge;
ALSubjects [] Als = new ALSubjects [] { new ALSubjects()};

public string StudID
{
get { return stID; }
set {stID = value ; }
}

public string StudName
{
get { return stName; }
set {stName = value ; }
}

public int studAge
{
get { return stAge; }
set {stAge = value ; }
}

public ALSubjects [] Alsubject
{
获取 {返回 Als; }
set {Als = value ; }
}
}

public class CompMember
{
string MemID;
string MemName;
int MemAge;

public string MemberID
{
get { return MemID; }
set {MemID = value ; }
}

public string MemberName
{
get { return MemName; }
set {MemName = value ; }
}

public int MemberAge
{
get { return MemAge; }
set {MemAge = value ; }
}
}
}





Service1.cs

 命名空间 WCFTest 
{
public class Service1:IService1
{
public string getVal(Student [] stu)
{
string t;
学生[] st = 学生[] {学生()};
for int i = 0 ; i < st.Length; i ++)
{
st [i] .StudID = stu [i] .StudID;
st [i] .StudName = stu [i] .StudName;
st [i] .studAge = stu [i] .studAge;
// st [i] .Alsubject = stu [i] .Alsubject;
st [i] .Alsubject = new ALSubjects [] { new ALSubjects()};
for int j = 0 ; j < st [i] .Alsubject.Length; j ++)
{
st [i] .Alsubject [j]。 SubID = stu [i] .Alsubject [j] .SubID;
}
}
// t = st [0] .StudName;
t = st [ 0 ] .Alsubject [ 0 ]。子ID;
return t;
}

public string PassMember(CompMember mem)
{
CompMember cmp = new CompMember();

cmp.MemberID = mem.MemberID;
cmp.MemberName = mem.MemberName;
cmp.MemberAge = mem.MemberAge;

string j = 您输入: + cmp.MemberID + + cmp.MemberName + + cmp.MemberAge.ToString();
return j;
}
}
}



服务项目的App.config

 <?  xml     version   =  1.0    encoding   =  utf-8    >  
< configuration >

< system.web >
< 编译 debug = true / >
< / system。网站 >
<! - 部署服务库项目时,必须将配置文件的内容添加到主机的
app.config文件中。 System.Configuration不支持库的配置文件。
- >

< system.serviceModel >
< < span class =code-leadattribute> bindings / >
< client / >
< 服务 >
< service name = WCFTest.Service1 >
< host >
< baseAddresses >
< 添加 baseAddress = http:// localhost:8732 / Design_Time_Addresses / WCFTest / Service1 / / >
< / baseAddresses >
< / host >
<! - 服务端点 - >
<! - 除非完全限定,否则地址与上面提供的基地址相关 - >
< endpoint 地址 = binding = basicHttpBinding 合同 = WCFTest。 IService1 >
<! -
部署后,应删除或替换以下标识元素,以反映运行已部署服务的
标识。如果删除,WCF将自动推断出适当的身份

- >

< 身份 >
< dns value = localhost / >
< / identity >
< / endpoint >
<! - 元数据端点 - >
<! - 元数据交换端点是服务用来向客户描述自己。 - >
<! - < span class =code-keyword> 此端点不使用安全绑定,应在部署之前加以保护或删除 - - >

< endpoint 地址 = mex binding = mexHttpBinding 合同 = IMetadataExchange / >
< / service >
< / services >
< span class =code-keyword><
行为 >
< serviceBehaviors >
< 行为 >
<! - 为避免泄露元数据信息,
将以下值设置为false并在部署之前删除上面的元数据端点
- >

< serviceMetadata httpGetEnabled = True / >
<! - 要接收故障中的异常详细信息以进行调试,
将以下值设置为true。在部署
之前设置为false以避免泄露异常信息
- >

< serviceDebug includeExceptionDetailInFaults = 错误 / >
< / behavior >
< / serviceBehaviors >
< ; / behavior >
< / system.serviceModel >

< / configuration >

< br $> b $ b



托管项目的web.config



 <?  xml    版本  =  1.0  >  
< 配置 >
< ; system.web >
< 编译 debug = false < span class =code-attribute> targetFramework = 4.0 / >
< / system.web >
< span class =code-keyword>< system.serviceModel >
< 服务 >
< endpoin t 地址 = binding = basicHttpBinding

合同 = WCFTest.IService1 listenUriMode = 明确 / >
<! - < endpoint
address =binding =wsHttpBinding
contract =WCFTest.IService1>
< identity>
< dns value =localhost/>
< / identity>
< / endpoint>
- >

< ; endpoint 地址 < span class =code-keyword> = mex binding = mexHttpBinding

合同 = IMetadataExchange / >
< / service >
< / services >
< 行为 >
< serviceBehaviors >
< 行为 name = MyServiceBehavior >
< serviceMetadata httpGetEnabled = true policyVersion = Policy15 / >
< serviceDebug includeExceptionDetailInFaults = true / >
< / behavior >
< / serviceBehaviors >
< / behavior >
< serviceHostingEnvironment multipleSiteBindingsEnabled = true / < span class =code-keyword>>
< / system.serviceModel >
< system.webServer >
< modules runAllManagedModulesForAllRequests = true / >
< / system.webServer >
< / configuration >

< br $> b $ b



消费CS文件

class 程序
{
Student [] st = null ;
CompMember cmp = new CompMember();
Service1Client proxy = new Service1Client( BasicHttpBinding_IService1 );

string mID = /,mName = /;
int mAge = 0 ;

// 将学生对象传递给服务
string gval()
{
st = new 学生[] { new Student()};
for int i = 0 ; i < st.Length; i ++)
{
st [i] .StudID = 001;
st [i] .StudName = Lal;
st [i] .studAge = 20 ;
st [i] .Alsubject = new ALSubjects [] { new ALSubjects()};
for int j = 0 ; j < st [i] .Alsubject.Length; j ++)
{
st [i] .Alsubject [j]。 SubID = 55;
st [i] .Alsubject [j] .SubName = 数学;
st [i] .Alsubject [j] .SubResult = A;
}
}

string t = proxy.getVal(st);
return t;
}

// 将会员详细信息传递给服务并获取所有传递值单个字符串
string PassMemb()
{
cmp = new CompMember();
cmp.MemberID = 4523;
cmp.MemberName = Jakson;
cmp.MemberAge = 30 ;
string j = proxy.PassMember(cmp);
return j;
}
静态 void Main( string [] args)
{
Program p = new Program();
// string j = p.test(10);
// string g = p.gval();
// string vx = p.PassMemb();
p.met();
// Console.WriteLine(j +\ n+ g +\ n+ vx + \ n \\ n');
Console.WriteLine(p.mID + \ n + p.mName + \ n + p.mAge的ToString());
Console.ReadLine();
}
}





这是用于调用WCF服务的PHP代码

 <?php  

try {
$ client = new SoapClient( HTTP://本地主机:1236 /网站/ Service.svc WSDL);

// 设置参数
$ parms [' CompMember'] [' MemberAge'] = ' 会员名称;
$ parms [' CompMember'] [ ' MemberID'] = 123 ;
$ parms [' CompMember'] [ 'MemberName']= 25;

// 调用Web服务PassMember methordd
$ webService = $ client-> PassMember($parms);
$wsResult = $webService->PassMemberResult();

// print response
print_r($wsResult);

} catch (Exception $e) {
echo 'Caught exception:', $e->getMessage(), \"\n\";
}
// -----------------------------------------------------

try{
$client = new SoapClient(\"http://localhost:1236/WebSite/Service.svc?wsdl\");



// Set parameters
$parms['Student']['Alsubject']['SubID'] = 'AL002';
$parms['Student']['Alsubject']['SubName'] = 'MATHS';
$parms['Student']['Alsubject']['SubResult'] = 'A';
$parms['Student']['StudID'] =\"123\";
$parms['Student'] ['StudName']= 'Student Name';
$parms['Student'] ['studAge']= 25;

// 调用Web服务PassMember methordd
$ webService = $ client-> getVal($parms);
$wsResult = $webService->getValResult();

// print response
print_r($wsResult);

} catch (Exception $e) {
echo 'Caught exception:', $e->getMessage(), \"\n\";
}
?>





When we call service via PHP We have exception

\"Caught exception: Object reference not set to an instance of an object.\"



If someone know solve this problem Please let me know.

Thanks,

Chamara.

解决方案

client = new SoapClient(\"http://localhost:1236/WebSite/Service.svc?wsdl\");

// Set parameters


parms['CompMember']['MemberAge'] = 'Member Name';


parms['CompMember']['MemberID'] =\"123\";


I have create WCF service Project. I can consume from .NET framework. I can pass a variable and can get return variable while consume from PHP. But I cannot consume that service when pass class object to service from PHP.

Iservice.cs

namespace WCFTest
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together.
    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        string getVal(Student[] st);

        [OperationContract]
        string PassMember(CompMember cmp);
    }

    public class ALSubjects
    {
        string SID;
        string SName;
        string sResult;

        public string SubID
        {
            get { return SID; }
            set { SID = value; }
        }

        public string SubName
        {
            get { return SName; }
            set { SName = value; }
        }

        public string SubResult
        {
            get { return sResult; }
            set { sResult = value; }
        }
    }

    public class Student
    {
        string stID;
        string stName;
        int stAge;
        ALSubjects[] Als = new ALSubjects[] { new ALSubjects()};

        public string StudID
        {
            get { return stID; }
            set { stID = value; }
        }

        public string StudName
        {
            get { return stName; }
            set { stName = value; }
        }

        public int studAge
        {
            get { return stAge; }
            set { stAge = value; }
        }

        public ALSubjects[] Alsubject
        {
            get { return Als; }
            set { Als = value; }
        }
    }

    public class CompMember
    {
        string MemID;
        string MemName;
        int MemAge;

        public string MemberID
        {
            get { return MemID; }
            set { MemID = value; }
        }

        public string MemberName
        {
            get { return MemName; }
            set { MemName = value; }
        }

        public int MemberAge
        {
            get { return MemAge; }
            set { MemAge = value; }
        }
    }
}



Service1.cs

namespace WCFTest
{   
    public class Service1 : IService1
    {
        public string getVal(Student[] stu)
        {
            string t;
            Student[] st = new Student[] {new Student()};
            for (int i = 0; i < st.Length; i++)
            {
                st[i].StudID = stu[i].StudID;
                st[i].StudName = stu[i].StudName;
                st[i].studAge = stu[i].studAge;
                //st[i].Alsubject = stu[i].Alsubject;
                st[i].Alsubject=new ALSubjects[] {new ALSubjects()};
                for (int j = 0; j < st[i].Alsubject.Length; j++)
                {
                    st[i].Alsubject[j].SubID = stu[i].Alsubject[j].SubID;
                }
            }
            //t = st[0].StudName;
            t = st[0].Alsubject[0].SubID;
            return t;
        }

        public string PassMember(CompMember mem)
        {
            CompMember cmp = new CompMember();

            cmp.MemberID = mem.MemberID;
            cmp.MemberName = mem.MemberName;
            cmp.MemberAge = mem.MemberAge;

            string j = "You Entered : "+cmp.MemberID+" : "+cmp.MemberName+" : "+cmp.MemberAge.ToString();
            return j;
        }
    }
}


App.config of service project

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <system.web>
    <compilation debug="true" />
  </system.web>
  <!-- When deploying the service library project, the content of the config file must be added to the host's
  app.config file. System.Configuration does not support config files for libraries. -->
  <system.serviceModel>
    <bindings />
    <client />
    <services>
      <service name="WCFTest.Service1">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8732/Design_Time_Addresses/WCFTest/Service1/"   />
          </baseAddresses>
        </host>
        <!-- Service Endpoints -->
        <!-- Unless fully qualified, address is relative to base address supplied above -->
        <endpoint address=""  binding="basicHttpBinding" contract="WCFTest.IService1">
          <!--
              Upon deployment, the following identity element should be removed or replaced to reflect the
              identity under which the deployed service runs.  If removed, WCF will infer an appropriate identity
              automatically.
          -->
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <!-- Metadata Endpoints -->
        <!-- The Metadata Exchange endpoint is used by the service to describe itself to clients. -->
        <!-- This endpoint does not use a secure binding and should be secured or removed before deployment -->
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information,
          set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="True"/>
          <!-- To receive exception details in faults for debugging purposes,
          set the value below to true.  Set to false before deployment
          to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

</configuration>




web.config of hosted project

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="false" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <services>
        <endpoint address="" binding="basicHttpBinding"

          contract="WCFTest.IService1" listenUriMode="Explicit"/>
        <!--<endpoint
          address="" binding="wsHttpBinding"
           contract="WCFTest.IService1">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>-->        
        <endpoint address="mex" binding="mexHttpBinding"

                  contract="IMetadataExchange"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyServiceBehavior">
          <serviceMetadata httpGetEnabled="true" policyVersion="Policy15"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>  
</configuration>




Consuming file of CS

class Program
    {
        Student[] st = null;
        CompMember cmp = new CompMember();
        Service1Client proxy = new Service1Client("BasicHttpBinding_IService1");

        string mID="/", mName="/";
        int mAge=0;

        // pass student object to service
        string gval()
        {
            st = new Student[] { new Student()};
            for (int i = 0; i < st.Length; i++)
            {
                st[i].StudID = "001";
                st[i].StudName = "Lal";
                st[i].studAge = 20;
                st[i].Alsubject = new ALSubjects[] { new ALSubjects()};
                for (int j = 0; j < st[i].Alsubject.Length; j++)
                {
                    st[i].Alsubject[j].SubID = "55";
                    st[i].Alsubject[j].SubName = "Maths";
                    st[i].Alsubject[j].SubResult = "A";
                }
            }

            string t = proxy.getVal(st);
            return t;
        }
        
        //Pass member details to service and get all pass value in single string 
        string PassMemb()
        {
            cmp = new CompMember();
            cmp.MemberID = "4523";
            cmp.MemberName = "Jakson";
            cmp.MemberAge = 30;
            string j = proxy.PassMember(cmp);
            return j;
        }
        static void Main(string[] args)
        {
            Program p = new Program();
            //string j = p.test(10);
            //string g = p.gval();
            //string vx = p.PassMemb();
            p.met();
            //Console.WriteLine(j+"\n"+g+"\n"+vx+"\n\n");
            Console.WriteLine(p.mID + " \n" + p.mName + " \n"+p.mAge.ToString());
            Console.ReadLine();
        }
    }



This is PHP code which used to call WCF service

<?php

try{
  $client = new SoapClient("http://localhost:1236/WebSite/Service.svc?wsdl");

// Set parameters
$parms['CompMember']['MemberAge'] = 'Member Name';
$parms['CompMember']['MemberID'] ="123";
$parms['CompMember'] ['MemberName']= 25;

// Call web service PassMember methordd
 $webService = $client-> PassMember($parms);
 $wsResult = $webService->PassMemberResult();
 
// print response
 print_r($wsResult);
       
       } catch (Exception $e) {
       echo 'Caught exception:',  $e->getMessage(), "\n";
}  
// -----------------------------------------------------

try{
  $client = new SoapClient("http://localhost:1236/WebSite/Service.svc?wsdl");
 


// Set parameters
$parms['Student']['Alsubject']['SubID']  = 'AL002';
$parms['Student']['Alsubject']['SubName']  = 'MATHS';
$parms['Student']['Alsubject']['SubResult']  = 'A';
$parms['Student']['StudID'] ="123";
$parms['Student'] ['StudName']= 'Student Name';
$parms['Student'] ['studAge']= 25;

// Call web service PassMember methordd
 $webService = $client-> getVal($parms);
 $wsResult = $webService->getValResult();
 
// print response
 print_r($wsResult);
       
       } catch (Exception $e) {
       echo 'Caught exception:',  $e->getMessage(), "\n";
}
?>



When we call service via PHP We have exception
"Caught exception: Object reference not set to an instance of an object."

If someone know solve this problem Please let me know.
Thanks,
Chamara.

解决方案

client = new SoapClient("http://localhost:1236/WebSite/Service.svc?wsdl"); // Set parameters


parms['CompMember']['MemberAge'] = 'Member Name';


parms['CompMember']['MemberID'] ="123";


这篇关于来自PHP的ConsumeWCF服务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆