首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >很难从android应用程序向.NET web服务发出soap请求

很难从android应用程序向.NET web服务发出soap请求
EN

Stack Overflow用户
提问于 2011-11-11 16:58:18
回答 1查看 1.1K关注 0票数 1

我在.NET中创建了一个名为“Login”的web服务方法,并在我的本地主机(IIS)中发布了它。该方法只接受两个字符串参数(用户名和密码),检查我在我的sql服务器中拥有的数据库中是否有与这些参数匹配的用户,如果它发现有人返回1,则返回0。从我的浏览器看,一切都很好。

我试图通过一个android应用程序达到这个方法(一开始只需将结果显示在屏幕上)。下面是代码(我从这里到那里找到了很多位):

代码语言:javascript
运行
复制
public class LoginCheck extends Activity {

    private static final String SOAP_ACTION = "http://tabtobook.org/Login";
    private static final String METHOD_NAME = "Login";
    private static final String NAMESPACE = "http://tabtobook.org/";
    private static final String URL = "http://192.168.1.2/TabBookServices/Users.asmx";
    private TextView tv;

    @Override
    public void onCreate(Bundle savedInstanceState) {
         /** Called when the activity is first created. */
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        tv=(TextView)findViewById(R.id.tv);
        ServiceCall();
    }
    public void ServiceCall()
    {
        try{
        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        String A="user1";
        request.addProperty("Username", A);
        String B="user1";
        request.addProperty("Password", B);

        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.dotNet=true;
        envelope.setOutputSoapObject(request);

        androidHttpTransport.call(SOAP_ACTION, envelope);

         SoapObject result = (SoapObject)envelope.getResponse();
         tv.setText(result.toString());
        }       

        catch (final IOException e)
        {
            ((TextView) findViewById(R.id.tView)).setText("test3");
            e.printStackTrace();

        } catch (final XmlPullParserException e)

        {
            e.printStackTrace();
        } catch (final Exception e)

        {
            e.printStackTrace();
        }
    }
}

从我的调试到目前为止,程序抛出了“最后一个异常e”(我的代码中的最后一个异常),当它出现在“androidHttpTransport.call(SOAP_ACTION,信封);”行时。我从WSDL中得到:

代码语言:javascript
运行
复制
targetNamespace="http://tabtobook.org/", location="http://localhost/TabBookServices/Users.asmx, soapAction="http://tabtobook.org/Login"

(我没有全部复制,因为我在这里做不到是有原因的。无论如何,在同一个web服务中还有其他不相关的方法),所以我认为我的名称空间、METHOD_NAME、SOAP_ACTION和URL是正确的。但作为一个肥皂新手,我不确定。

那怎么回事?请求信封是否格式错误,还是使用androidHttpTransport错误?(或者两者兼而有之!)

编辑:我在日志中放了几行。我认为是"android.os.NetworkOnMainThreadException“抛出了异常。我应该尝试一些类似于Asynchtask的东西来处理它吗?

11-11 21:17:53.607: D/AndroidRuntime(4574):关闭VM 11-11 21:17:53.667: I/AndroidRuntime(4574):注意:连接线程'Binder Thread #3‘失败11-11 21:53.667: D/dalvikvm(4574):GC_CONCURRENT释放了102 K,77%释放了483 k/2048K,暂停了1ms+3ms 11-11 21:17:53.667: D/dalvikvm(4574):对象注册表有一个条目11-11 21:17:54.117: W/System.err(4491):android.os.NetworkOnMainThreadException 11-11 21:17:54.237: W/System.err(4491):at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:74) 11-11 21:17:54.237: W/System.err(4491):在libcore.io.BlockGuardOs.connect(BlockGuardOs.java:74) 11-11 21:17:54.248: Wlibcore.io.IoBridge.connectErrno(IoBridge.java:127) 11-11 21:17:54.248: W/System.err(4491):libcore.io.IoBridge.connect(IoBridge.java:112) 11-11 21:17:54.298: W/System.err(4491):java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 11-11 21:17:54.298: W/System.err(4491 )):java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459) 11-11 21:17:54.298: W/System.err(4491):at java.net.Socket.connect(Socket.java:842) 11-11 21:17:54.307: W/System.err(4491):at libcore.net.http.HttpConnection.(HttpConnection.java:77) 11-11 21:17:54.317: W/System.err(4491):atlibcore.net.http.HttpConnection.(HttpConnection.java:50)

我使用Asynchtask完成了它:(我不编辑第一篇文章,这样所有的内容都存在于其中)

代码语言:javascript
运行
复制
private class DownloadWebPageTask extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... urls) {
        String response = "";
        try {

                SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
                HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
                String A="user2";
                request.addProperty("Username", A);
                String B="user2";
                request.addProperty("Password", B);
                SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
                envelope.dotNet=true;
                envelope.setOutputSoapObject(request);

                androidHttpTransport.call(SOAP_ACTION, envelope);
                SoapObject result = (SoapObject)envelope.bodyIn; 
                response=result.toString();                     

                }

             catch (Exception e) {
                e.printStackTrace();

            }
        return response;
    }

    @Override
    protected void onPostExecute(String result) {
        tv.setText(result);
    }
}

public void ServiceCall() {
    DownloadWebPageTask task = new DownloadWebPageTask();
    task.execute(); 
    }
}

如果用户存在,则屏幕上显示的是"LoginResponse{LoginResult=1;}“,如果用户不存在,则为”LoginResponse{LoginResult=0;}“。所以这个方法很好!

现在,我有两个问题要让它成为我想要的登录模块(当然,我会搜索那些):

  1. 我需要一种方法来获取方法中的结果"0“或"1”。或者我想也许我可以用下整根绳子。但是,当我尝试像"if(result.equals("LoginResponse{LoginResult=1;}"))“这样的东西时,它不起作用(它没有得到一个真正的值)。有什么问题吗?

  1. ,我希望用户输入数据。因此,我必须将参数传递给AsyncTask。这有可能吗?还是应该在AsyncTask类中读取输入(在按钮上设置侦听器)?

编辑:第二,我在这里找到了答案,-> Android: How can I pass parameters to AsyncTask's onPreExecute()?

编辑:对于第一,所缺少的只是一个空间!

代码语言:javascript
运行
复制
if(result.equals("LoginResponse{LoginResult=1; }"))

工作得很好!不过,我想知道如何得到正确的方法结果(0或1)。如果有人知道,请回答!

EN

回答 1

Stack Overflow用户

发布于 2011-11-11 21:55:29

请提供有关如何设置Dot.Net服务的更多信息。特别是您正在使用的绑定类型和正在使用的Dot.Net框架的版本。

在异构客户端环境中使用Dot.Net WCF服务的最佳方法是构建一个简单的Java来使用该服务,以确保您的WCF堆栈上的绑定和安全配置是以其他技术可以使用的开放方式设置的。例如,在WCF4.0中,除basicHttpBinding之外的每种绑定类型都提供用户身份验证和传输安全性,这要求客户端在功能上兼容。

一旦您证明了异构Java客户机,您也将更好地理解其他非WCF客户端需要做什么。

按照同样的思路,也尝试使用SoapUI使用您的WCF服务。它是一个Java工具,实现了在异构环境中验证您的服务的相同目标。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8097347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档