1

C# で安らかな Web サービスを作成しました。POST メソッドを呼び出すと、400 bad request エラーが発生します。フィドラーでリクエストをチェックしていますが、POST リクエストは問題ありません。プログラムの何が問題なのかわかりません。

コードの一部を次に示します。他のコードを確認する必要がある場合は、お問い合わせください。

インターフェース

[ServiceContract]
public interface IRead
{
    [OperationContract]
    [WebInvoke(UriTemplate = "GetCard", Method = "POST")]
    someObject GetCard(Session session);
}

NFCSession はセッション名の int 変数を持つオブジェクトです。

POST リクエストを生成するクライアント

public void GetCard()
{
        string strGetCard = "http://localhost:8384/Reader/GetCard";

        byte[] dataByte = GenerateNFCSession(63315152);

        HttpWebRequest POSTRequest = (HttpWebRequest)WebRequest.Create(strGetCard);
        POSTRequest.Method = "POST";
        POSTRequest.ContentType = "application/xml;charset=UTF-8";
        POSTRequest.ContentLength = dataByte.Length;

        Stream POSTstream = POSTRequest.GetRequestStream();

        POSTstream.Write(dataByte, 0, dataByte.Length);

        HttpWebResponse POSTResponse = (HttpWebResponse)POSTRequest.GetResponse();
        StreamReader reader =
          new StreamReader(POSTResponse.GetResponseStream(), Encoding.UTF8);
        Console.WriteLine("Response");
        Console.WriteLine(reader.ReadToEnd().ToString());
}

XML ジェネレーター

private static byte[] GenerateXML(int sessionID)
    {
        MemoryStream mStream = new MemoryStream();
        XmlTextWriter xmlWriter = new XmlTextWriter(mStream, Encoding.UTF8);
        xmlWriter.Formatting = Formatting.Indented;
        xmlWriter.WriteStartDocument();
        xmlWriter.WriteStartElement("Session");
            xmlWriter.WriteStartElement("session");
                xmlWriter.WriteString(sessionID.ToString());
            xmlWriter.WriteEndElement();
        xmlWriter.WriteEndElement();
        xmlWriter.WriteEndDocument();
        xmlWriter.Flush();
        xmlWriter.Close();
        Console.WriteLine(mStream.ToArray().ToString());
        return mStream.ToArray();

    }

web.config

<?xml version="1.0"?>
<configuration>
<system.web>
    <compilation debug="true" targetFramework="4.0" />
</system.web>

<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
  <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, 
System.Web,Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</modules>
</system.webServer>

<system.serviceModel>

<behaviors>
  <serviceBehaviors>
    <behavior>
      <serviceMetadata httpGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="false"/>
    </behavior>
  </serviceBehaviors>
</behaviors>

<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>

<standardEndpoints>
  <webHttpEndpoint>
    <standardEndpoint name="" helpEnabled="true" faultExceptionEnabled="true"
automaticFormatSelectionEnabled="true"></standardEndpoint>
  </webHttpEndpoint>
</standardEndpoints>

</system.serviceModel>

<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>

</configuration>

Fiddler からの POST 要求 XML

<?xml version="1.0" encoding="utf-8"?>
<Session>
  <session>63315152</session>
</Session>

このエラーが発生します

The server encountered an error processing the request.

注: XmlSerializer Format Attribute を指定すると、正常に動作します。しかし、後で JSON リクエストに対してもサービスを機能させたいと考えています。私の観点からは、 format 属性を明示的に指定する必要はありません。このコードの何が問題なのか、私は真剣に理解していません。

みんな助けてください!!!

4

2 に答える 2

0

私のWebサービスは現在正常に機能しています。

私が行った変更は、DataContract属性にあります。

当初は次のようでした。

[DataContract]

私はそれをこれに変更しました:

[DataContract(Namespace="")]

そしてそれは働き始めました...

ヒント:Webサービスを実行すると、Webサービスの「/help」ページにサンプルのPOSTリクエストが表示されます。私はこのページに注意を払ったことはありません。しかし、それは非常に便利です。この例をFiddlerの実際のリクエストと比較すると、名前空間が異なることがわかりました。:D

于 2013-02-19T18:42:42.807 に答える
0

<enableWebScript />動作タグ内に追加してみてください:

...
<behaviors>
  <serviceBehaviors>
    <behavior>
      <serviceMetadata httpGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="false"/>
      <enableWebScript />
    </behavior>
  </serviceBehaviors>
</behaviors>
...

ここで議論されています:http://social.msdn.microsoft.com/Forums/en/wcf/thread/fb48999f-cd41-49b8-ae9a-f0c8f5aebbd2

于 2013-02-19T15:45:02.457 に答える