1

PHP ページで Web サービスを呼び出しています。Web サービスは C# です。SOAP クライアント オブジェクトを使用してメソッドを呼び出そうとすると、次のようなエラーが表示されます。

System.NullReferenceException: Object reference not set to an instance of an object.

Web サービス メソッドを呼び出すために使用するコードは次のとおりです。

 $Username = "username";
 $Password = "password";
 $LifetimeRequest = 60*60*24;


$soap_data = array(
   'Username' => $Username,
   'Password' => $Password,
   'LifetimeRequest' => $LifetimeRequest
);
$client = new SoapClient('http://50.56.173.161:8502/AdomniService.svc?wsdl');
$response = $client->ClientLogin($soap_data);
var_dump($response);

使用するvar_dumpと、次のような出力が表示されます。

object(stdClass)#2 (1) {
  ["ClientLoginResult"]=>
  object(stdClass)#3 (3) {
    ["Error"]=>
    object(stdClass)#4 (5) {
      ["Private"]=>
      float(2)
      ["Public"]=>
      int(1)
      ["Details"]=>
      string(284) "System.NullReferenceException: Object reference not set to an instance of an object.
   at Adomni.AdomniService.ClientLogin(ClientLoginRequest request) in C:\Users\megiddo\Documents\Visual Studio 2010\Projects\Adomni\AdOmniAPIService\AdomniService\AdomniClientService.svc.cs:line 107"
      ["ErrorCode"]=>
      int(0)
      ["ErrorMessage"]=>
      NULL
    }
    ["Status"]=>
    int(-1)
    ["Token"]=>
    object(stdClass)#5 (8) {
      ["Private"]=>
      float(2)
      ["Public"]=>
      int(1)
      ["EventNotificationUri"]=>
      NULL
      ["IsManager"]=>
      bool(false)
      ["LifetimeRequest"]=>
      int(0)
      ["Password"]=>
      NULL
      ["TokenId"]=>
      int(0)
      ["UserName"]=>
      NULL
    }
  }
}

ここで何が間違っているのか誰にも教えてもらえますか? 前もって感謝します。

C# で使用されたコードは次のようになります。

using System; 
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Web.Security;
using System.IO;
using System.Data;
using AdOmniWebPortal.AdOmniService;

namespace AdOmniWebPortal
{
    public partial class Login : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }

        protected void AdOmniLogin_Authenticate(object sender, AuthenticateEventArgs e)
        {
            AdomniServiceClient Client = new AdomniServiceClient();
            LoginRequest LoginRequest = new LoginRequest();
            LoginResponse LoginResponse = new LoginResponse();

            LoginRequest.Username = AdOmniLogin.UserName;
            LoginRequest.Password = AdOmniLogin.Password;
            LoginRequest.LifetimeRequest = 60*60*24;
            //This guy will be changed
            LoginRequest.EventNotificationURL = new Uri("http://herp-a-derp.com/awesome.html");

            LoginResponse = Client.Login(LoginRequest);

            if (LoginResponse.Status == 0)
            {
                System.Web.Security.FormsAuthentication.RedirectFromLoginPage(LoginResponse.Token.UserName, true);
                LifetimeToken token = LoginResponse.Token;
                Session["Token"] = token;

                GetUserRequest request = new GetUserRequest() { Token = token };
                GetUserResponse response = Client.GetUser(request);

                if (response.GetUser.Type == AdOmniService.UserType.Seller)
                {
                    Response.Redirect("~/Pages/Seller/SellerHomeDashboard.aspx");
                }

                if (response.GetUser.Type == AdOmniService.UserType.Client)
                {
                    Response.Redirect("~/Pages/Buyer/BuyerHomeDashboard.aspx");
                }

                if (response.GetUser.Type == AdOmniService.UserType.None)
                {
                    Response.Redirect("~/Pages/Buyer/BuyerHomeDashboard.aspx");
                }
            }
            else
            {
                Response.Redirect("~/Login.aspx");
                Response.Write(LoginResponse.Error.ErrorMessage);
            }
        }
    }
}

.cs ページのコンテンツ全体を編集に入れました。

4

2 に答える 2

1

Fiddler(httpデバッグプロキシ)を使用する

これにより、Webサービスに対して行われるリクエストの内部をピークにすることができます(xml形式)

何かが足りないかどうかを確認できます。

フィドルを介してC#クライアントをチャネルし、見てみましょう

http://www.fiddler2.com/fiddler2/

于 2012-12-13T10:54:10.490 に答える
0

おそらく、PHP スクリプトで、EventNotificationURL変数も設定する必要があります。

エラー応答のこのセクションを見てください。

  ["EventNotificationUri"]=>
  NULL

おそらくサービスは、EventNotificationUriあなたがPassword,UsernameLifetimeRequest.

[編集]

変数名を から に変更してみてUsernameくださいUserName。私が知る限り、PHPはこの問題で大文字と小文字を区別する必要があるため、"Username" != "UserName"

于 2012-12-13T11:25:18.267 に答える