【问题标题】:UNABLE to POST data to WCF from Android无法从 Android 将数据发布到 WCF
【发布时间】:2014-01-18 11:31:15
【问题描述】:

我正在尝试从 Android 应用程序向 WCF 服务发送数据,但不知何故,该服务似乎没有通过 android 调用。我通过 LOGCAT 中的 adnroid 收到了一个 STATUSCODE 值 = 500(这意味着内部服务器错误)我浏览了源代码 100 次,但没有找出错误。并且几乎检查了与我的问题相关的所有帖子,但仍然没有得到任何解决方案。

这是代码

安卓代码:

private class sendPostData extends AsyncTask<String, Void, String>
{
@Override
protected String doInBackground(String... params) {
    // TODO Auto-generated method stub

    HttpPost request = new HttpPost( LOGIN_SERVICE_URL + "/MyCar");
    request.setHeader("Accept", "application/json");            
    request.setHeader("Content-type", "application/json");
    JSONStringer getCarInfo;
    try {
        getCarInfo = new JSONStringer()
            .object()
                .key("myCar")
                    .object()
                        .key("Name").value(edt_carName.getText().toString())                                  
                        .key("Make").value(edt_carMake.getText().toString())
                        .key("Model").value(edt_carModel.getText().toString())
                    .endObject()
                .endObject();

    StringEntity entity = new StringEntity(getCarInfo.toString());

    request.setEntity(entity);

    // Send request to WCF service
    DefaultHttpClient httpClient = new DefaultHttpClient();
    HttpResponse response = httpClient.execute(request);
    Log.d("WebInvoke", "Saving : " + response.getStatusLine().getStatusCode());
    }
    catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return null;
}

@Override
protected void onPostExecute(String result) {
    txt_verif.setText("Success");
}
}

除了调用 WCF 服务外,在 android 代码中一切正常。我多次调试代码并收到 statuscode = 500

这里是 WCF 服务

Service.cs

public class Service1 : IService1
{
    public void UpdateMyCar(myCar myCar) {

        string strConnectionString = ConfigurationManager.ConnectionStrings["Database1"].ConnectionString;
        SqlConnection conn = new SqlConnection(strConnectionString);
        conn.Open();
        using (SqlCommand cmd = new SqlCommand("Insert into TestingTable (Name,Make,Model) Values (@Name,@Make,@Model)", conn)) {

            cmd.Parameters.AddWithValue("@Name", myCar.Name);
            cmd.Parameters.AddWithValue("@Make", myCar.Make);
            cmd.Parameters.AddWithValue("@Model", myCar.Model);

            int queryResult = cmd.ExecuteNonQuery();
        } conn.Close();
    }

LogCat

WebInvoke     Saving : 500

IService1.svc

[ServiceContract]
public interface IService1
{
    [OperationContract]
    [WebInvoke(
        Method = "POST",
        UriTemplate = "MyCar",
        BodyStyle = WebMessageBodyStyle.WrappedRequest,
        ResponseFormat = WebMessageFormat.Json,
        RequestFormat = WebMessageFormat.Json)]
    void UpdateMyCar(myCar myCar);
}

[DataContract]
public class myCar 
{

    [DataMember(Name="Name")]
    public string Name 
    { 
        get; 
       set; 
    }

    [DataMember(Name="Model")]
    public string Model 
    { 
        get; 
        set; 
    }

    [DataMember(Name="Make")]
    public string Make 
    { 
        get;
        set; 
    }

Web.Config

<?xml version="1.0"?>

<configuration>
<appSettings/>
<connectionStrings/>
<system.web>
    <compilation debug="true" targetFramework="4.0">
    </compilation>

    <authentication mode="Windows"/>
    <pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/></system.web>
<system.serviceModel>
    <services>
        <service name="CarSercive.Service1" behaviorConfiguration="CarSercive.Service1Behavior">
            <!-- Service Endpoints -->
            <endpoint address="" binding="webHttpBinding" contract="CarSercive.IService1">
                <identity>
                    <dns value="localhost"/>
                </identity>
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="CarSercive.Service1Behavior">
                <serviceMetadata httpGetEnabled="true"/>

                <serviceDebug includeExceptionDetailInFaults="false"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>

此服务也在 IIS 上发布。我还使用 google chrome 扩展程序检查了该服务 SIMPLE REST CLIENT 并收到了内部服务器错误

【问题讨论】:

  • SIMPLE REST CLIENT 在响应正文中显示什么? WCF 会告诉您错误详细信息,我们需要该信息。
  • 感谢您的回复。由于 EndpointDispatcher 的 AddressFilter 不匹配,我收到此 localhost:8259/Service1.svc/MyCar' 无法在接收方处理。检查发送方和接收方的 EndpointAddresses 是否一致
  • @GregEnnis 我在 web.config 文件中找到了一些机会。我将 Binding = "webHttpBinding" 更改为 "wsHttpBinding" 所以 statuscode 已更改为 415
  • 您是否考虑过使用 Web API 代替 WCF?这更容易配置。状态 415 表示不支持的媒体类型 (json)
  • 不,我没有考虑任何 Web API。但我的 WCF 服务 RequestFormat = WebMessageFormat.Json 也在 JSON 中

标签: c# android asp.net wcf web-services


【解决方案1】:

问题是您的主机名与您在手机上使用的不匹配。

您可以暂时关闭地址过滤器来解决这个问题:

[ServiceBehavior(AddressFilterMode=AddressFilterMode.Any)]
public class Service1 : IService1
{
    ....
}

但你应该在发布到生产环境时修复主机名

【讨论】:

  • 这确实修复了您发布的错误。你现在得到一个不同的错误。这是什么?
  • 是的@Greg Ennis 我现在遇到了一个不同的错误。由于 EndpointDispatcher 的 ContractFilter 不匹配,无法在接收方处理。这可能是因为合约不匹配(发送方和接收方之间的操作不匹配)或发送方和接收方之间的绑定/安全不匹配。检查发送方和接收方是否具有相同的合同和相同的绑定(包括安全要求,例如消息、传输、无)。
【解决方案2】:

在您的机器上创建一个具有正确端口号的域,并确保您能够使用 Google 的 Rest 客户端调用该服务。如果它有效,那么如果您使用您的 Android 手机调用该服务,您将不会发现任何问题.

以下文章将有助于使用正确的端口号设置虚拟目录。[http://www.hosting.com/support/iis7/create-new-sites-in-iis-7/]

注意你不能直接从你的手机调用 localhost。至少尝试使用 ipaddress 调用服务。[http://localhost/service/mycar] =>[http://DemoService /service/mycar]

【讨论】:

  • 感谢您的回复我没有测试安卓手机。我正在模拟器上测试该服务,该模拟器适用于其他服务。
  • 我在 Google 扩展程序中得到了相同的响应。 500(内部服务器错误)
  • 我希望下面的代码能帮助你进行更多的调试。我认为你的代码中出现了一些异常或者某个地方失败了。
【解决方案3】:

以下代码将帮助您稍微深入地调试代码。

catch (Exception ex)
            {
                WebException webexception = (WebException)ex;
                var responseresult = webexception.Response as HttpWebResponse;

                //Code to debug Http Response
                var responseStream = webexception.Response.GetResponseStream();
                string fault_message = string.Empty;
                int lastNum = 0;
                do
                {
                    lastNum = responseStream.ReadByte();
                    fault_message += (char)lastNum;
                } while (lastNum != -1);
                responseStream.Close();
}

【讨论】:

    【解决方案4】:

    没关系,我在 web.config 文件中进行了几处更改并得到了解决方案。 &lt;endpointBehaviors&gt; tag 在我的情况和其他几件事中丢失。这是 web.config 文件的更新代码。

    [更新的 web.config 文件]

    <?xml version="1.0"?>
    <configuration>
    <appSettings/>
      <connectionStrings>
    <add name="DB" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Munyb\Documents\Visual Studio 2010\Projects\CarSercive\CarSercive\App_Data\Database1.mdf;Integrated Security=True;User Instance=True" providerName="System.Data.SqlClient"/>
      </connectionStrings>
    <system.web>
        <compilation debug="true" targetFramework="4.0">
        </compilation>
        <authentication mode="Windows"/>
        <pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/></system.web>
    <system.serviceModel>
        <services>
            <service name="CarSercive.Service1" behaviorConfiguration="RESTfulServ">
                <!-- Service Endpoints -->
        <endpoint address="" binding="webHttpBinding" contract="CarSercive.IService1" behaviorConfiguration="web"></endpoint>
            </service>
        </services>
        <behaviors>
      <endpointBehaviors>
        <behavior name="web">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
            <serviceBehaviors>
                <behavior name="RESTfulServ">
                    <serviceMetadata httpGetEnabled="true"/>
                    <serviceDebug includeExceptionDetailInFaults="false"/>
                </behavior>
            </serviceBehaviors>
    
        </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true">
    </serviceHostingEnvironment>
    </system.serviceModel>
      <system.webServer>
        <modules runAllManagedModulesForAllRequests="true"> 
        </modules>
      </system.webServer>
    </configuration>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-02
      • 1970-01-01
      • 1970-01-01
      • 2011-02-27
      相关资源
      最近更新 更多